AQS中公平锁和非公平锁的区别
场景:一个线程运行完毕,准备去等待队列中唤醒(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的方法都没有检查是否需要排队的操作,所以这是非公平锁和公平锁最主要的区别,当线程释放锁成功,公平锁会去检查自己是否要去排队,只要其他线程比当前线程快或者当前有等待队列,则直接去排队;非公平锁则不一样,线程会去尝试拿锁,不管当前有没有正在等待的队列,一旦拿锁成功,表示插队成功,非公平的意义体现了。如果拿锁失败,并且当前有队列,则该线程会插入队尾。插入队列以后,队列中的线程顺序都是固定无法改变的。
AQS中公平锁和非公平锁的区别相关推荐
- java中ReentrantLock实现,公平锁和非公平锁,AQS并发队列,
一般在java中,遇到并发的时候,我们很多时候可能会使用synchronized关键字来实现锁,但是synchronized关键字有一定的缺陷(比如无法实现类似读锁.非公平),而Lock可以实现.在j ...
- AQS中的公平锁和非公平锁
正文 公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁. 优点:所有的线程都能得到资源,不会饿死在队列中. 缺点:吞吐量会下降很多,队列里面除了第一个 ...
- AQS中公平锁和非公平锁区别,你知道么
点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/weixin_43823391/ article/details/114259418 一.概念 注意:因为ReentrantLo ...
- 闲聊AQS面试和源码解读---可重入锁、LockSupport、CAS;从ReentrantLock源码来看公平锁与非公平锁、AQS到底是怎么用CLH队列来排队的?
AQS原理可谓是JUC面试中的重灾区之一,今天我们就来一起看看AQS到底是什么? 这里我先整理了一些JUC面试最常问的问题? 1.Synchronized 相关问题以及可重入锁 ReentrantLo ...
- AQS之公平锁和非公平锁
AQS之公平锁和非公平锁(二) 一.概念 注意:因为ReentrantLock 类可以实现公平锁和非公平锁,所以本文的讲解以该类为主. 1.1 公平锁 多个线程按照申请锁的顺序去获得锁,线程会直接 ...
- ReentrantLock中公平锁和非公平锁的区别
目录 背景知识 ReentrantLock的组成 概述 公平锁示意图 非公平锁示意图 源码解读 非公平锁 公平锁 代码对比 问题 知识扩展 tryLock方法 参考资料 背景知识 ReentrantL ...
- aqs原理初探以及公平锁和非公平锁实现
深入理解AQS 一,AQS 1,ReentrantLock 2,CAS 3,AbstractQueuedSynchronizer 3.1,FairSync 3.2,NofairSync 3.3,AQS ...
- 【并发】ReentrantLock中公平锁和非公平锁的理解
[前言] ReentrantLock 是在JavaSE5之后,并发包中新增了Lock接口用来实现锁功能,它提供了与synchronized关键字类似的同步功能.同时ReentrantLock也是重入锁 ...
- java 共享锁 独占锁_java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁...
一.公平锁与非公平锁 1.1 概述 公平锁:是指多个线程按照申请锁的顺序来获取锁. 非公平锁:是指在多线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取到锁,在高并发的情 ...
- 多线程中的公平锁和非公平锁
一.公平锁与非公平锁概念: 锁Lock分为"公平锁"和"非公平锁",公平锁表示线程获取锁的顺序是按照线程加锁的顺序分配的,即先来先得的FIFO先进先出的 ...
最新文章
- jquery纯数字验证
- c#中高效的excel导入oracle的方法(转)
- python自定义安装哪些不需要_python setup.py配置,用于在自定义目录中安装文件
- 利用sort对数组快速排序
- 超级有意思的图片注释
- 使用 Flink Hudi 构建流式数据湖平台
- Docker学习(四)Docker镜像原理 镜像commit操作补充
- 面试字节跳动后台开发(实习)
- 大促活动如何抵御大流量 DDoS 攻击?
- 嵌入式开发笔记-STM32CudeIDE平台入门
- java 计算行驶里程,js根据经纬度换算行驶里程
- 电路方程的矩阵形式 c语言,电路方程的矩阵形式
- java-php-python-springboot线上教学平台计算机毕业设计
- DPP Substrate 1中英文说明书
- C++/模拟键盘输入/自动打字机/解放双手
- 从摆地摊到全球网商10强
- WORD制表位完成杂志目录视频教程
- js计算字符串包含几个字符
- AppUtils【获取手机的信息和应用版本号、安装apk】
- Flash与Flex3结合学习心得体会
热门文章
- oracle蓝屏解决方法,遭遇蓝屏 (转)
- LTE网络PUSCH功控计算
- 我的世界服务器玩家系统,我的世界: 为什么服务器玩家比单机玩家多很多? 这5大优势是关键!...
- docker gitlab的备份和迁移
- 视频教程-一夫老师讲premiere从初级到精通视频教程-CG动画
- 淘宝/天猫优惠券查询接口 API 返回值说明
- 老小区加装电梯杂谈-为什么底层1/2楼愿意加装电梯
- 李子柒的视频为什么这么吸引人?对她在B站上发布的视频进行分析
- 命令提示符 简单使用
- discard long time none received connection