AQS中公平锁和非公平锁的区别

article/2025/9/27 5:51:53

场景:一个线程运行完毕,准备去等待队列中唤醒(unpark)线程。
公平锁:

在这里插入图片描述
在这里插入图片描述

当hasQueuedPredecessors 返回false时,则表示不需要去排队,会直接进行cas操作去修改state状态
hasQueuedPredecessors解析
当hasQueuedPredecessors返回false:
h和t相等:一.当队列未初始化时头节点和尾节点都为null,固然相等;二.当队列已经初始化并且已经有线程产生过队列,并且线程已经释放了state状态置为0,则头节点和尾节点都指向同一个节点,即傀儡节点,这个节点是没有线程属性的。
h和t不相等,(s = h.next) == null 和s.thread != Thread.currentThread() 都为false,整个方法才能放回false
当头节点和尾节点不同时,说明队列肯定有>=2数量的节点,则头节点的next节点肯定不等于null,则第一个条件返回了false。
当前线程和next节点的线程相等时返回false,说明当前线程占有了锁,无需排队,方法直接放回false,直接通过compareAndSetState修改state状态。

当hasQueuedPredecessors返回true:
h和t不相等,表示队列中有>=2数量的节点。
h.next为null时,说明刚好有线程在操作队列把头节点的next节点脱离队列,则表示已经该线程正在修改state,所以需要排队,或者next.thread不为当前线程时说明已经有线程修改完state,把node节点的线程置为自己的线程,则当前线程也需要去排队。

非公平锁:

在这里插入图片描述

在这里插入图片描述

当非公平锁调用lock方法时,一开始就去尝试修改state,如果成功则直接占有状态,并且设置当前线程,不管是刚刚进入的直接去拿锁或者后面实现的tryAcquire的方法都没有检查是否需要排队的操作,所以这是非公平锁和公平锁最主要的区别,当线程释放锁成功,公平锁会去检查自己是否要去排队,只要其他线程比当前线程快或者当前有等待队列,则直接去排队;非公平锁则不一样,线程会去尝试拿锁,不管当前有没有正在等待的队列,一旦拿锁成功,表示插队成功,非公平的意义体现了。如果拿锁失败,并且当前有队列,则该线程会插入队尾。插入队列以后,队列中的线程顺序都是固定无法改变的。


http://chatgpt.dhexx.cn/article/kMfpFef0.shtml

相关文章

AQS中的公平锁和非公平锁

正文 公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁。 优点:所有的线程都能得到资源,不会饿死在队列中。 缺点:吞吐量会下降很多,队列里…

公平锁和非公平锁介绍

公平锁: 解释:多个线程按照申请锁的顺序执行,先来后到。 优点:所有的线程都能得到资源,不会饿死在队列中。 缺点:吞吐量会下降很多,队列里面除了第一个线程,其他的线程都会阻塞&a…

公平锁和非公平锁的详解

公平锁 加锁时考虑排队等待问题,按照申请锁的顺序,按照FIFO规则,先申请的线程先取得锁,其他线程进入队列等待锁的释放,当锁释放后,在队头的线程被唤醒。 非公平锁 加锁时不考虑排队等待问题,直接…

可重入锁的理解及公平锁和非公平锁的具体实现

可重入锁 首先结合以下两个例子理解以下可重入锁的概念。 /*** 可重入锁:* 1、可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁,这样的锁就叫做可重入锁。* 2、是指在同一个线程在外层方法获取锁的时…

公平锁与非公平锁的核心原理

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章是关于并发编程中AQS的独占模式和共享模式。 本篇文章记录的基础知识,适合在学Java的小白,也适合复习中,面试中的大佬&#x1…

公平锁和非公平锁介绍,为什么要“非公平”?

什么是公平和非公平 公平锁指的是按照线程请求的顺序,来分配锁;而非公平锁指的是不完全按照请求的顺序,在一定情况下,可以允许插队。但需要注意这里的非公平并不是指完全的随机,不是说线程可以任意插队,而…

图解ReentrantLock公平锁和非公平锁实现

概述 ReentrantLock是Java并发中十分常用的一个类,具备类似synchronized锁的作用。但是相比synchronized, 它具备更强的能力,同时支持公平锁和非公平锁。 公平锁: 指多个线程按照申请锁的顺序来获取锁,线程直接进入队列中排队&a…

Java面试突击:公平锁和非公平锁有什么区别?

从公平的角度来说,Java 中的锁总共可分为两类:公平锁和非公平锁。但公平锁和非公平锁有哪些区别?孰优孰劣呢?在 Java 中的应用场景又有哪些呢?接下来我们一起来看。 正文公平锁:每个线程获取锁的顺序是按照线程访问锁的先后顺序获取的&am…

浅谈ReentrantLock的公平锁和非公平锁的区别

前言 最近在看java并发编程这本书,已经看了点ReentrantLock的源码,以及之前有面试官问,公平锁和非公平锁有啥区别,我就只是从源码层面说了一下区别,但在性能上也有区别,今天就来说道说道。 公平与非公平 …

aqs原理初探以及公平锁和非公平锁实现

深入理解AQS 一,AQS1,ReentrantLock2,CAS3,AbstractQueuedSynchronizer3.1,FairSync3.2,NofairSync3.3,AQS中几个重要的相关参数3.4,Node 一,AQS AbstractQueuedSynchro…

图解ReentrantLock底层公平锁和非公平锁实现原理

💻在面试或者日常开发当中,经常会遇到公平锁和非公平锁的概念。 两者最大的区别如下👇 1️⃣ 公平锁:N个线程去申请锁时,会按照先后顺序进入一个队列当中去排队,依次按照先后顺序获取锁。就像下图描述的上…

ReentrantLock之公平锁和非公平锁详解

ReentrantLock是一个互斥锁,它具有synchronized相同的能力;但相比之下,ReentrantLock扩展性更强,比如实现了公平锁。 下面详细拆解下ReentrantLock的公平锁和非公平锁的实现。 JDK版本:1.8.0_40 公平锁 先看Reentr…

ReentrantLock中公平锁和非公平锁的区别

目录 背景知识 ReentrantLock的组成 概述 公平锁示意图 非公平锁示意图 源码解读 非公平锁 公平锁 代码对比 问题 知识扩展 tryLock方法 参考资料 背景知识 ReentrantLock的组成 首先看下ReentrantLock的组成结构。 公平锁和非公平锁主要是通过内部类FairSync和…

公平锁和非公平锁

Reentrant Re entrant,Re是重复、又、再的意思,entrant是enter的名词或者形容词形式,翻译为进入者或者可进入的,所以Reentrant翻译为可重复进入的、可再次进入的,因此ReentrantLock翻译为重入锁或者再入锁。 公平锁…

阿里面试官:说一下公平锁和非公平锁的区别?

点赞再看,养成习惯,微信搜索【三太子敖丙】关注这个互联网苟且偷生的工具人。 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点、资料以及我的系列文章。 前言 上次我们提到了乐观锁和悲观锁,那我们知道…

Ubuntu 手动安装 JDK8

文章目录 1. 下载2. 解压安装3. 配置环境变量 1. 下载 先去官网下载合适的版本,官网:https://www.oracle.com/java/technologies/downloads/archive/ 通过下载页面获取到下载链接后,可以直接在Ubuntu上使用wget下载,也可以先下载…

centos8安装jdk教程

文章目录 一、安装二、配置环境变量三.验证 一、安装 1、查看JDK软件包列表 yum search java | grep -i --color jdk2、选择版本安装 yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel或者如下命令安装jdk8所有文件 yum install -y java-1.8.0-openjdk*二、配置…

Java - JDK8安装及配置环境变量教程

Java - JDK8安装及配置环境变量教程 一、安装JDK教程 甲骨文官网下载JDK版本:windows64下载地址 下载完成后开始安装JDK:双击打开 点击下一步: 若不需要自定义路径,则安装到默认路径即可(安装的路径需记住&#xff0…

JDK8安装和环境配置

JDK8的安装和环境配置 一、JDK8下载二、安装三、环境配置 一、JDK8下载 官网下载: https://www.oracle.com/java/technologies/downloads/#java8-windows 二、安装 打开安装,一直下一步即可,可以在安装过程中更改安装地址,我放…

Java JDK 8的安装与配置

文章目录 前言1. 安装JDK 8Step1:选择JDK的版本Step2:选择系统平台Step3:下载安装包Step4:开始安装 2. 配置JDK 8Step1:配置“环境变量path” 前言 本教程是在Windows 64位平台上安装JDK 8版本。 1. 安装JDK 8 官网…