高薪程序员必修课-Java中 ReentrantLock的公平锁和非公平锁底层实现原理

目录

前言

公平锁(Fair Lock)

原理

实现

示例代码

底层实现

非公平锁(Non-Fair Lock)

原理

实现

示例代码

底层实现

比较与选择

总结

⭐️ 好书推荐


前言

        在Java中,ReentrantLock 提供了公平锁和非公平锁两种模式。这两种锁模式在底层的实现机制不同,以保证公平性或提高性能。下面将详细讲解这两种锁的底层实现原理。

公平锁(Fair Lock)

原理

        公平锁通过队列来维护锁的获取顺序,确保每个线程按照请求的顺序获得锁。公平锁避免了线程饥饿现象。

实现
  1. 锁请求顺序:公平锁在每次尝试获取锁时,都会先检查等待队列中是否有其他线程在等待锁。如果有,则当前线程会被加入到等待队列中,排队等待。

  2. 锁的获取:当锁被释放时,会唤醒等待队列中的下一个线程,这样可以确保线程按照请求顺序依次获得锁。

示例代码

以下是公平锁的简化实现示例:

public class FairLockExample {private final ReentrantLock fairLock = new ReentrantLock(true); // 公平锁public void lockMethod() {fairLock.lock();try {// 关键代码区域} finally {fairLock.unlock();}}
}
底层实现

        公平锁的实现依赖于 AbstractQueuedSynchronizer(AQS)中的FIFO队列。以下是关键的实现细节:

  • 队列管理:AQS 维护一个FIFO队列,用于存放等待获取锁的线程。
  • 锁的获取:在尝试获取锁时,如果队列中有其他线程在等待,当前线程会被加入队列,并阻塞等待。
  • 锁的释放:在释放锁时,会从队列中唤醒下一个等待的线程,确保锁的公平性。
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) // overflowthrow new Error("Maximum lock count exceeded");setState(nextc);return true;}return false;
}

非公平锁(Non-Fair Lock)

原理

        非公平锁在设计上为了提高性能,并不保证线程获取锁的顺序。相较于公平锁,非公平锁可以减少上下文切换,提供更高的吞吐量。

实现
  1. 抢占机制:非公平锁允许线程在每次请求锁时直接尝试获取锁,而不考虑等待队列中的其他线程。这种机制使得锁的获取变得不公平,但减少了线程的等待时间,提高了性能。

  2. 锁的获取:如果锁是空闲的,任何请求锁的线程都可以立即获得锁;如果锁被占用,线程会被加入等待队列。

示例代码

以下是非公平锁的简化实现示例:

public class NonFairLockExample {private final ReentrantLock nonFairLock = new ReentrantLock(false); // 非公平锁public void lockMethod() {nonFairLock.lock();try {// 关键代码区域} finally {nonFairLock.unlock();}}
}
底层实现

        非公平锁的实现也是依赖于 AbstractQueuedSynchronizer(AQS),但在尝试获取锁时,非公平锁直接通过CAS操作尝试获取锁,而不是检查等待队列。

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;
}

比较与选择

  • 公平锁:适用于需要严格控制线程获取锁顺序,避免线程饥饿的场景,但可能会带来较多的上下文切换,影响性能。
  • 非公平锁:适用于需要高性能的场景,通过减少上下文切换来提高吞吐量,但可能会导致线程饥饿问题。

总结

  • 公平锁:通过维护FIFO队列,确保线程按照请求顺序依次获取锁,避免线程饥饿。
  • 非公平锁:通过抢占机制直接尝试获取锁,提高性能和吞吐量,但可能导致线程饥饿。

    

⭐️ 好书推荐

《Effective Java中文版》

【内容简介】

        本书是Jolt获奖作品Effective Java的第3版,对上一版进行了全面更新,涵盖了从Java 5到Java 9的种种特性,是Java开发人员不可缺少的一本参考书。

        本书分为12章,包含90个条目,形式简洁。每个条目中都讲述了对Java的独到见解,阐明了如何编写高效、优雅的程序,并且提供了清晰、易懂的示例代码。与上一版相比,本书增加了Lambda表达式、流、Optional类、接口默认方法、try-with-resources、@SafeVarargs注解、模块等Java 7及以后所引入的新特性。本书介绍了如何充分利用泛型、枚举、注解、自动装箱、for-each循环、可变参数、并发机制等各种特性,帮助读者更加有效地使用Java编程语言及其基本类库(java.lang、java.util和java.io,以及子包,如java.util.concurrent和java.util.function等)。

📚 京东购买链接:【2024年全新译本】Effective Java中文版

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

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

相关文章

taoCMS v3.0.2 文件上传漏洞(CVE-2022-23880)

前言 CVE-2022-23880是一个影响taoCMS v3.0.2的任意文件上传漏洞。攻击者可以利用此漏洞通过上传特制的PHP文件在受影响的系统上执行任意代码。 漏洞细节 描述: 在taoCMS v3.0.2的文件管理模块中存在任意文件上传漏洞。攻击者可以通过上传恶意的PHP文件来执行任意代码。 影响…

光伏电站数据采集方案(基于工业路由器部署)

​ 一、方案概述 本方案采用星创易联SR500工业路由器作为核心网关设备&#xff0c;实现对光伏电站现场数据的实时采集、安全传输和远程监控。SR500具备多接口、多功能、高可靠性等特点&#xff0c;能够满足光伏电站数据采集的各种需求。&#xff08;key-iot.com/iotlist/sr500…

如何策划交互设计创意?( 计育韬老师高校公益巡讲答疑实录2024)

这是计育韬老师第 8 次开展面向全国高校的新媒体技术公益巡讲活动了。而在每场讲座尾声&#xff0c;互动答疑环节往往反映了高校师生当前最普遍的运营困境&#xff0c;特此计老师在现场即兴答疑之外&#xff0c;会尽量选择有较高价值的提问进行文字答疑梳理。 *本轮巡讲主题除了…

【Altium】AD-在原理图中如何绘制贝塞尔曲线

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 在原理图中绘制贝塞尔曲线的方法 2、 问题场景 贝塞尔曲线主要用来描述各种波形曲线&#xff0c;如正弦、余弦曲线等。贝塞尔曲线的绘制和直线类似&#xff0c;需要固定多个顶点&#xff08;最少4个&#xff09;后即…

详解 RisePro 信息窃密木马

RisePro 是一种窃密木马&#xff0c;以恶意软件即服务&#xff08;MaaS&#xff09;的模式在地下论坛出售。该恶意软件家族最早在 2022 年被发现&#xff0c;近期攻击行为快速增长。 RisePro 不依赖特定的感染媒介&#xff0c;可以通过多种方式植入失陷主机&#xff0c;通常使…

Zabbix 配置WEB监控

Zabbix WEB监控介绍 在Zabbix中配置Web监控&#xff0c;可以监控网站的可用性和响应时间。Zabbix提供了内置的Web监控功能&#xff0c;通过配置Web场景&#xff08;Web Scenario&#xff09;&#xff0c;可以监控HTTP/HTTPS协议下的Web服务。 通过Zabbix的WEB监控可以监控网站…

Java的NIO体系

目录 NIO1、操作系统级别下的IO模型有哪些&#xff1f;2、Java语言下的IO模型有哪些&#xff1f;3、Java的NIO应用场景&#xff1f;相比于IO的优势在哪&#xff1f;4、Java的IO、NIO、AIO 操作文件读写5、NIO的核心类 :Buffer&#xff08;缓冲区&#xff09;、Channel&#xff…

【代码随想录——图论——图论理论基础】

1. 图论理论基础 1.1 图的基本概念 二维坐标中&#xff0c;两点可以连成线&#xff0c;多个点连成的线就构成了图。 当然图也可以就一个节点&#xff0c;甚至没有节点&#xff08;空图&#xff09; 1.1.1 图的种类 有向图 加权有向图无权有向图 无向图 加权无向图无权无向…

.NET C# 使用OpenCV实现人脸识别

.NET C# 使用OpenCV实现模型训练、人脸识别 码图~~~ 1 引入依赖 OpenCvSHarp4 - 4.10.0.20240616 OpenCvSHarp4.runtime.win - 4.10.0.20240616 2 人脸数据存储结构 runtime directory | face | {id}_{name} | *.jpg id - 不可重复 name - 人名 *.jpg - 人脸照片3 Demo 3.…

松下Panasonic机器人维修故障原因

松下机器人伺服电机是许多工业自动化设备的关键组成部分。了解如何进行Panasonic工业机械臂电机维修&#xff0c;对于确保设备正常运行至关重要。 【松下焊接机器人维修案例】【松下机器人维修故障排查】 一、常见松下工业机械手伺服电机故障及原因 1. 过热&#xff1a;过热可…

vue2+element-ui新增编辑表格+删除行

实现效果&#xff1a; 代码实现 &#xff1a; <el-table :data"dataForm.updateData"border:header-cell-style"{text-align:center}":cell-style"{text-align:center}"><el-table-column label"选项字段"align"center&…

C++:求梯形面积

梯形面积 已知上底15厘米&#xff0c;下底25厘米&#xff0c;问梯形面积值是多少&#xff1f; #include<iostream> using namespace std; int main() {//梯形的面积公式&#xff08;上底下底&#xff09; 高 2//上底变量、下底变量int s,d,h,m;s15;d25;h 2*150 * 2/s ;…

相亲交友APP系统婚恋交友社交软件开发语音视频聊天平台定制开发-婚恋相亲交友软件平台介绍——app小程序开发定制

互联网飞速发展的时代&#xff0c;相亲交友软件成为了许多年轻人首选的相亲方式&#xff0c;越来越多的单身男女希望在婚恋交友软件平台上寻找灵魂伴侣&#xff0c;相亲交友软件因此具有很高的市场价值。 多客婚恋相亲交友系统是一款定位高端&#xff0c;到手就能运营的成熟婚恋…

Redis 管道(Pipeline)是什么?有什么用?

目录 1. redis 客户端-服务端模型的不足之处 2. redis 管道是什么&#xff1f;有什么好处&#xff1f; 3. 管道的使用场景 4. 管道使用的注意事项 1. redis 客户端-服务端模型的不足之处 众所周知&#xff0c;redis 是一个客户端-服务端的模型设计&#xff0c;客户端向服务…

SALOME源码分析:View Model

作为一款开源的CAx(CAD/CAE/CAM)软件集成平台&#xff0c;为了实现各个Module支持不同的数据显示与交互方案&#xff0c;出于扩展性的考虑&#xff0c;SALOME引入了View Model&#xff0c;用以支持OpenGL、OCC、VTK、ParaView、Qwt等数据显示与交互实现。 本文将以OCCViewer、…

一文搞懂 java 线程池:ScheduledThreadPool 和 WorkStealingPool 原理

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

PHP宜邦家政服务管理系统-计算机毕业设计源码04426

目 录 摘要 1 绪论 1.1 选题背景与意义 1.2开发现状 1.3论文结构与章节安排 2 宜邦家政服务管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 操作可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用…

力扣hot100 -- 动态规划(上)

目录 ❄技巧 &#x1f33c;爬楼梯 &#x1f354;杨辉三角 &#x1f30a;打家劫舍 &#x1f40e;完全平方数 &#x1f33c;零钱兑换 &#x1f33c;单词拆分 ❄技巧 动态规划dp-CSDN博客 &#x1f446;花 5 分钟快速刷一遍 花 10 分钟浏览一下 线性DP 背包DP&#x1f447…

VS展示6个错误中的0个解决方法

左键点击展示6个错误中的0个 左键点击展示23个警告中的0个

国产强大免费WAF, 社区版雷池动态防护介绍

雷池WAF&#xff0c;基于智能语义分析的下一代 Web 应用防火墙 使用情况 我司于2023年4月23日对雷池进行测试&#xff0c;测试一个月后&#xff0c;于2023年5月24日对雷池进行正式切换&#xff0c;此时版本为1.5.1。 里程碑纪念 后续一直跟随雷池进行版本升级&#xff0c;当前…