在ReentrantLock中包含了公平锁和非公平锁两种锁,通过查看源码可以看到这两种锁都是继承自Sync,而Sync又继承自AbstractQueuedSynchronizer,而AbstractQueuedSynchronizer又继承自AbstractOwnableSynchronizer,下面是类的继承关系图: 

其中AbstractOwnableSynchronizer是提供了设置占用当前锁的线程信息的方法,主要的锁的实现还是在AbstractQueuedSynchronizer中实现的,在AbstractQueuedSynchronizer中通过CLH队列实现了多线程锁的排队使用,但是该队列的实现并不能保证锁的公平竞争,但是在某些业务场景中会需要保证先到的线程先得到锁,所以就有了公平锁和非公平锁的诞生。

通过分析ReentrantLock中的公平锁和非公平锁的实现,其中tryAcquire是公平锁和非公平锁实现的区别,下面的两种类型的锁的tryAcquire的实现,从中我们可以看出在公平锁中,每一次的tryAcquire都会检查CLH队列中是否仍有前驱的元素,如果仍然有那么继续等待,通过这种方式来保证先来先服务的原则;而非公平锁,首先是检查并设置锁的状态,这种方式会出现即使队列中有等待的线程,但是新的线程仍然会与排队线程中的对头线程竞争(但是排队的线程是先来先服务的),所以新的线程可能会抢占已经在排队的线程的锁,这样就无法保证先来先服务,但是已经等待的线程们是仍然保证先来先服务的,所以总结一下公平锁和非公平锁的区别:

1、公平锁能保证:老的线程排队使用锁,新线程仍然排队使用锁。 
2、非公平锁保证:老的线程排队使用锁;但是无法保证新线程抢占已经在排队的线程的锁。

公平锁的tryAcquire

 /*** Fair version of tryAcquire.  Don't grant access unless* recursive call or no waiters or is first.*/protected final boolean tryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) { // !hasQueuedPredecessors()保证了不论是新的线程还是已经排队的线程都顺序使用锁 if (!hasQueuedPredecessors() && compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } else if (current == getExclusiveOwnerThread()) { int nextc = c + acquires; if (nextc < 0) throw new Error("Maximum lock count exceeded"); setState(nextc); return true; } return false; }

非公平锁的

/*** Performs non-fair tryLock.  tryAcquire is implemented in* subclasses, but both need nonfair try for trylock method.*/final boolean nonfairTryAcquire(int acquires) {final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) { // 新的线程可能抢占已经排队的线程的锁的使用权 if (compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } else if (current == getExclusiveOwnerThread()) { int nextc = c + acquires; if (nextc < 0) // overflow throw new Error("Maximum lock count exceeded"); setState(nextc); return true; } return false; }

ReentrantLock和LockSupport

转载于:https://www.cnblogs.com/snowwhite/p/9478754.html

深入分析ReentrantLock公平锁和非公平锁的区别 (转)相关推荐

  1. 深入分析ReentrantLock公平锁和非公平锁的区别

    在ReentrantLock中包含了公平锁和非公平锁两种锁,通过查看源码可以看到这两种锁都是继承自Sync,而Sync又继承自AbstractQueuedSynchronizer,而AbstractQ ...

  2. ReentrantLock与公平锁、非公平锁实现

    前言  最近开始读JDK源码,所有心得准备总结成一个专栏,JDK Analysis系列的第一篇,就从万众瞩目的ReentrantLock开始吧,而谈到ReentrantLock,就不得不说AQS,它是 ...

  3. Java进阶:ReentrantLock实现原理解析(公平锁、非公平锁、可重入锁、自旋锁)

    概述 本篇将介绍公平锁.非公平锁.可重入锁.自旋锁相关理论知识,同时结合相关源码和Demo进行解析,主要是以ReentrantLock作为例子. 公平锁 公平锁定义 公平锁是指线程按照申请所的顺序来获 ...

  4. reentrantlock非公平锁不会随机挂起线程?_【原创】Java并发编程系列16 | 公平锁与非公平锁...

    本文为何适原创并发编程系列第 16 篇,文末有本系列文章汇总. 上一篇提到重入锁 ReentrantLock 支持两种锁,公平锁与非公平锁.那么这篇文章就来介绍一下公平锁与非公平锁. 为什么需要公平锁 ...

  5. 公平锁非公平锁的实际使用_理解ReentrantLock的公平锁和非公平锁

    学习AQS的时候,了解到AQS依赖于内部的FIFO同步队列来完成同步状态的管理,当前线程获取同步状态失败时,同步器会将当前线程以及等待状态等信息构造成一个Node对象并将其加入到同步队列,同时会阻塞当 ...

  6. ReentrantLock 公平锁和非公平锁加锁和解锁源码分析(简述)

    - title: ReentrantLock 公平锁和非公平锁加锁和解锁源码分析(简述) - date: 2021/8/16 文章目录 一.ReentrantLock 1. 构造函数 二.Reentr ...

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

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

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

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

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

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

最新文章

  1. 女程序员做编程也太难了吧! | 每日趣闻
  2. python扫描端口脚本_Python端口扫描简单程序
  3. golang类型断言及检测其是否断言成功
  4. MAX232和PL2303、CH340的区别
  5. CCNA-第十五篇-DHCP配置+SDN介绍(最后一章)
  6. mac_android_studio_环境搭建
  7. typecho独一无二的后台美化主题模板
  8. 辛辛苦苦写100条测试用例,为何只被正经执行的只有50条?
  9. matlab函数sinh,matlab sinh 使用方法
  10. 134安装教程_最新市政造价教程
  11. 计算机老师一句话,40句感恩教师的一句话
  12. 解决鼠标右键中没有新建选项
  13. 基于STM32F429的DCMI实现OV7725-NF无缓存摄像头的图像采集HAL库
  14. 当当当~他来喽CCRC-PIP个人信息保护专业人员
  15. 大学计算机课程制作生日卡片,计算机《制作生日贺卡》教学设计.doc
  16. 写一段关于等离子杀菌技术的商业模式规划
  17. 蓝桥杯龟兔赛跑预测Python(超详细!!)
  18. hdu1827 1269 2767 强连通分支 刷水
  19. 【多元统计分析】一、多元统计分析概述
  20. “重感知·轻地图”重新定义自动驾驶

热门文章

  1. 初识python教学反思_[python第一课]初识python
  2. 关系型数据库和mysql教材_关系型数据库(MySQL)
  3. 计算机考试不用输入扩展名吗,本周末的 计算机等级考试,如果不想考0分,一定要花2分钟看完...
  4. python【蓝桥杯vip练习题库】ALGO-69字符串逆序
  5. python【蓝桥杯vip练习题库】ALGO-157 阶乘末尾(高精度)
  6. Tensorflow【实战Google深度学习框架】—使用 TensorFlow 实现模型
  7. Android移动开发之【Android实战项目】DAY10-App端耗流量场景问题及减少消耗办法
  8. 脚本程序转变为可执行程序的第三方库——pyinstaller
  9. java instanceof 原理_java-在现代JVM实现中如何实现instanceof?
  10. php传输数组给axios