场景:一个线程运行完毕,准备去等待队列中唤醒(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中公平锁和非公平锁的区别相关推荐

  1. java中ReentrantLock实现,公平锁和非公平锁,AQS并发队列,

    一般在java中,遇到并发的时候,我们很多时候可能会使用synchronized关键字来实现锁,但是synchronized关键字有一定的缺陷(比如无法实现类似读锁.非公平),而Lock可以实现.在j ...

  2. AQS中的公平锁和非公平锁

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

  3. AQS中公平锁和非公平锁区别,你知道么

    点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/weixin_43823391/ article/details/114259418 一.概念 注意:因为ReentrantLo ...

  4. 闲聊AQS面试和源码解读---可重入锁、LockSupport、CAS;从ReentrantLock源码来看公平锁与非公平锁、AQS到底是怎么用CLH队列来排队的?

    AQS原理可谓是JUC面试中的重灾区之一,今天我们就来一起看看AQS到底是什么? 这里我先整理了一些JUC面试最常问的问题? 1.Synchronized 相关问题以及可重入锁 ReentrantLo ...

  5. AQS之公平锁和非公平锁

    AQS之公平锁和非公平锁(二) 一.概念 注意:因为ReentrantLock 类可以实现公平锁和非公平锁,所以本文的讲解以该类为主. 1.1 公平锁 ​ 多个线程按照申请锁的顺序去获得锁,线程会直接 ...

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

    目录 背景知识 ReentrantLock的组成 概述 公平锁示意图 非公平锁示意图 源码解读 非公平锁 公平锁 代码对比 问题 知识扩展 tryLock方法 参考资料 背景知识 ReentrantL ...

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

    深入理解AQS 一,AQS 1,ReentrantLock 2,CAS 3,AbstractQueuedSynchronizer 3.1,FairSync 3.2,NofairSync 3.3,AQS ...

  8. 【并发】ReentrantLock中公平锁和非公平锁的理解

    [前言] ReentrantLock 是在JavaSE5之后,并发包中新增了Lock接口用来实现锁功能,它提供了与synchronized关键字类似的同步功能.同时ReentrantLock也是重入锁 ...

  9. java 共享锁 独占锁_java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁...

    一.公平锁与非公平锁 1.1 概述 公平锁:是指多个线程按照申请锁的顺序来获取锁. 非公平锁:是指在多线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取到锁,在高并发的情 ...

  10. 多线程中的公平锁和非公平锁

    一.公平锁与非公平锁概念:     锁Lock分为"公平锁"和"非公平锁",公平锁表示线程获取锁的顺序是按照线程加锁的顺序分配的,即先来先得的FIFO先进先出的 ...

最新文章

  1. jquery纯数字验证
  2. c#中高效的excel导入oracle的方法(转)
  3. python自定义安装哪些不需要_python setup.py配置,用于在自定义目录中安装文件
  4. 利用sort对数组快速排序
  5. 超级有意思的图片注释
  6. 使用 Flink Hudi 构建流式数据湖平台
  7. Docker学习(四)Docker镜像原理 镜像commit操作补充
  8. 面试字节跳动后台开发(实习)
  9. 大促活动如何抵御大流量 DDoS 攻击?
  10. 嵌入式开发笔记-STM32CudeIDE平台入门
  11. java 计算行驶里程,js根据经纬度换算行驶里程
  12. 电路方程的矩阵形式 c语言,电路方程的矩阵形式
  13. java-php-python-springboot线上教学平台计算机毕业设计
  14. DPP Substrate 1中英文说明书
  15. C++/模拟键盘输入/自动打字机/解放双手
  16. 从摆地摊到全球网商10强
  17. WORD制表位完成杂志目录视频教程
  18. js计算字符串包含几个字符
  19. AppUtils【获取手机的信息和应用版本号、安装apk】
  20. Flash与Flex3结合学习心得体会

热门文章

  1. oracle蓝屏解决方法,遭遇蓝屏 (转)
  2. LTE网络PUSCH功控计算
  3. 我的世界服务器玩家系统,我的世界: 为什么服务器玩家比单机玩家多很多? 这5大优势是关键!...
  4. docker gitlab的备份和迁移
  5. 视频教程-一夫老师讲premiere从初级到精通视频教程-CG动画
  6. 淘宝/天猫优惠券查询接口 API 返回值说明
  7. 老小区加装电梯杂谈-为什么底层1/2楼愿意加装电梯
  8. 李子柒的视频为什么这么吸引人?对她在B站上发布的视频进行分析
  9. 命令提示符 简单使用
  10. discard long time none received connection