ReentrantLock如何实现公平和非公平锁?

本文讲解了ReentrantLock是如何实现公平和非公平两种锁的原理。

点击上方“后端开发技术”,选择“设为星标” ,优质资源及时送达

上一篇文章,我详细讲解了ReentrantLock的加锁和解锁的原理,请自行阅读。

5bbf50cef24cb00460f8104ddd390847.jpeg

重点,一文掌握ReentrantLock加解锁原理!|原创


看完之后,大家可能有一个疑问。

为什么继承AQS实现的ReentrantLock,获取锁不成功都需要进入同步队列,那后续解锁并且争夺锁的过程就是有序的,为什么会有公平和不公平?

实际上进入队列中挂起的线程确实是公平的,差别在于在进入队列之前的抢占过程,如下图。

0aff3d72f82376fcef08a86628fa3b4d.png

公平锁FairSync和非公平锁NonfairSync实现区别在于非公平锁会无视是否有已经排队的线程,直接与队头线程参与锁的竞争,具体细节如下:

1、 当有新的线程进入,非公平锁会直接加入争夺锁的过程,使用compareAndSetState()方法直接CAS抢占。而公平锁不会抢占,直接调用acquire()方法。

//非公平锁
final void lock() {// 直接参与争夺锁if (compareAndSetState(0, 1))setExclusiveOwnerThread(Thread.currentThread());elseacquire(1);
}
// 公平锁
final void lock() {acquire(1);
}

2、当初次尝试抢占失败的时候,非公平锁会在tryAcquire()方法中再次尝试抢占。而公平锁会先使用hasQueuedPredecessors()方法判断同步队列是否有前驱节点,如果没有的话才会加入抢占,否则进入队列排队。

//非公平锁
protected final boolean tryAcquire(int acquires) {return nonfairTryAcquire(acquires);
}
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) // overflowthrow new Error("Maximum lock count exceeded");setState(nextc);return true;}return false;
}
// 公平锁
protected final boolean tryAcquire(int acquires) {final Thread current = Thread.currentThread();int c = getState();if (c == 0) {// 判断是否有前驱节点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;
}

在进入队列参与锁竞争的逻辑之前讲过了,本文不再赘述。

最后,欢迎大家提问和交流。

如果对你有帮助,欢迎点赞、评论或分享,感谢阅读!

除了MVCC,Undo Log 还有哪些作用?|原创

2022-11-23

5e7225f4923f1ba3972bc7931700c53c.jpeg

update在MySQL中是怎样执行的,一张图牢记|原创

2022-11-19

652e3d745f231d484709f90996145cde.jpeg

MySQL主从数据不一致,怎么办?

2022-11-15

d367f3ba868956835828f3fcd5ee5793.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/36551.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多把锁+ReentrantLock+活锁+死锁

目录 多把锁 活跃性 定位死锁 例题&#xff1a;哲学家问题 活锁 饥饿 ReentrentLock锁 用法 打断锁 tryLock()设置超时方法 哲学家问题优化——ReentrantLock解决死锁 公平锁 多把锁 并发度&#xff1a; 同一个时间节点上&#xff0c;可能与服务端进行交互的用户个数…

重磅出击,20张图带你彻底了解ReentrantLock加锁解锁的原理

最近是上班忙项目&#xff0c;下班带娃&#xff0c;忙的不可开交&#xff0c;连摸鱼的时间都没有了。今天趁假期用图解的方式从源码角度给大家说一下ReentrantLock加锁解锁的全过程。系好安全带&#xff0c;发车了。 简单使用 在聊它的源码之前&#xff0c;我们先来做个简单的…

深入源码谈谈ReentrantLock中的公平锁和非公平锁的加锁机制

前言 ReentrantLock和synchronized一样都是实现线程同步&#xff0c;但是像比synchronized它更加灵活、强大、增加了轮询、超时、中断等高级功能&#xff0c;可以更加精细化的控制线程同步&#xff0c;它是基于AQS实现的锁&#xff0c;他支持公平锁和非公平锁&#xff0c;同时…

【图解】一篇搞定ReentrantLock的加锁和解锁过程

文章目录 1. 概述2. AbstractQueuedSynchronizer&#xff08;AQS&#xff09;3. 加锁4. 解锁5. 公平锁和非公平锁的区别 1. 概述 本文主要结合图片分析ReentrantLock加锁和解锁过程的源码&#xff0c;加锁和解锁的原理不清楚的读者可以好好看看。 2. AbstractQueuedSynchroni…

Lock锁和ReentrantLock锁

前言 JDK 1.5中提供的锁的接口java.util.concurrent.locks.Lock&#xff0c;其提供了一些ReentrantLock, ReentrantReadWriteLock实现类。 参考JDK文档&#xff1a;Java Platform SE 6 目录 前言 Lock接口 ReentrantLock 公平性和非公平性 公平锁与非公平锁的使用示例 A…

ReentrantLock源码分析(一)加锁流程分析

一、ReetrantLock的使用示例 static ReentrantLock lock new ReentrantLock(); public static void main(String[] args) throws InterruptedException { new Thread(ClassLayOutTest::reentrantLockDemo, "threadA").start(); Thread.sleep(1000);…

Lock与ReentrantLock

Lock Lock位于java.util.concurrent.locks包下&#xff0c;是一种线程同步机制&#xff0c;就像synchronized块一样。但是&#xff0c;Lock比synchronized块更灵活、更复杂。 1. Lock继承关系 2. 官方文档解读 3. Lock接口方法解析 public interface Lock {// 获取锁。如果锁…

ReentrantLock介绍

文章目录 ReentrantLock1、构造函数2、公平性锁和非公平性锁&#xff08;1&#xff09;公平性锁和非公平性锁示例&#xff08;2&#xff09;公平锁和非公平锁的实现公平性锁&#xff1a;FairLock非公平性锁 &#xff08;3&#xff09;Condition生产者和消费者 循环打印ABC Reen…

ReentrantLock锁相关方法

目录 Lock接口的实现类 ReentrantLock的方法 ReentrantLockTest测试 用于测试的线程 t1测试 正确释放重入锁 获取当前的重入次数 t1t2测试 使用islocked()方法检测锁状态 t1t3测试 使用trylock方法尝试获取锁 使用isHeldByCurrentThread方法检测当前线程是否持有锁 不…

ReentrantLock详解

目录 一、ReentrantLock的含义 二、RerntrantLock当中的常用方法 ①lock()和unlock()方法 ②构造方法 ③tryLock()方法 tryLock()无参数 tryLock(timeout,Times)有参数 ④lockInterruptibly() throws InterruotedException 经典面试问题: ReentrantLock和synchronized有什…

OpenAI最新官方ChatGPT聊天插件接口《智能聊天插件引言》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(一)(附源码)

Chat Plugins Limited Alpha 聊天插件 前言IntroductionPlugin flow 插件流其它资料下载 Learn how to build a plugin that allows ChatGPT to intelligently call your API. 了解如何构建允许ChatGPT智能调用API的插件。 前言 在现代的软件开发环境中&#xff0c;使用第三方…

Pycharm快速入门(10) — 插件管理

1、插件安装 File | Settings | Plugins | Marketplace 搜索插件点击Install安装 2、插件卸载 File | Settings | Plugins | Installed 选择需要卸载的插件&#xff0c;点击Uninstall。 3、推荐插件 &#xff08;1&#xff09;、Chinese ​(Simplified)​ Language Pack &am…

chatgpt赋能python:Python编程的好玩之处:用简单的代码创造奇妙的世界

Python编程的好玩之处&#xff1a;用简单的代码创造奇妙的世界 如果你喜欢写代码&#xff0c;那么Python是一个不错的选择。Python语言设计简单&#xff0c;易学易用&#xff0c;同时还拥有丰富的生态系统&#xff0c;支持许多强大的第三方库和框架&#xff0c;可以使你轻松地…

chatgpt赋能python:Python图片拼图的好处和应用

Python图片拼图的好处和应用 Python是一种高级编程语言&#xff0c;已经被广泛应用于数据科学、网络编程、机器学习等领域。其中&#xff0c;Python的图像处理领域也越来越受关注。在本文中&#xff0c;我们将介绍如何使用Python创建图片拼图&#xff0c;并讨论它的好处和应用…

midjourney教程:如何快速生成个性化Logo设计

midjourney是一款基于人工智能技术的Logo设计工具&#xff0c;它可以帮助用户快速生成个性化的Logo设计&#xff0c;而无需具备专业的设计技能。下面将为大家介绍midjourney的使用方法&#xff0c;以帮助大家轻松生成符合自己需求的Logo设计。 第一步&#xff1a;登录midjourn…

chatgpt赋能python:Python添加图片背景的方法

Python添加图片背景的方法 简介 Python是一种开源的高级编程语言&#xff0c;广泛应用于各个行业中&#xff0c;包括图像处理。添加图片背景是图像处理中的常见需求&#xff0c;通过Python可以很方便地实现。 本篇文章将介绍如何使用Python来给图片添加背景&#xff0c;让您…

chatgpt赋能python:Python怎么做图形

Python怎么做图形 在数据可视化和图像处理方面&#xff0c;Python已经成为了最受欢迎的编程语言之一。Python的图形库使得创建各种图形和图表、可视化工具和图像处理应用程序变得容易而简单。 在本文中&#xff0c;我们将会介绍一些最受欢迎的Python图形库&#xff0c;以帮助…

程序员晒追女神聊天截图,坦言第一次没经验,网友直呼凭实力单身

前段时间网络上一名程序员晒出了自己与女神之间的聊天记录的对话截图&#xff0c;通过截图中我们可以看出&#xff0c;应该是这位程序员在追求这位女神&#xff0c;但是短短的十几分钟几条聊天记录&#xff0c;却以女神不再愿意搭理程序员结束&#xff0c;对于这样的结局&#…

程序员给女友4千生活费,收到女友错发信息后分手,神对话!

如何平衡好亲情爱情的关系&#xff0c;是一门学问&#xff0c;有的人就希望自己的另一半过好他们自己的小日子&#xff0c;不要对家里的事情过多的付出&#xff0c;但有人觉得自己父母养大自己不容易&#xff0c;能有能力的话&#xff0c;不光孝敬爹妈&#xff0c;还会帮衬家里…

程序员就是这样聊天把女朋友聊没的

身为程序员 都想当然的认为 身为一个优秀的程序员 我怎么可能会没女票 这不科学啊 工资高&#xff0c;话少 有一天看到了 某个程序员的聊天记录 有女孩主动搭讪 这么绝好的机会 然后你竟然说忙 说忙 忙... 主动找你搭讪 你还不抓紧机会约约约 如果改成&#xff1a…