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

news2024/12/27 20:27:17

目录

前言

公平锁(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) // overflow
            throw 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) // overflow
            throw 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.coloradmin.cn/o/1892561.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

详解 RisePro 信息窃密木马

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

抖音本地生活服务商入驻流程须知指南!

近日&#xff0c;抖音发布关于新增《【到家外卖】内容服务商开放准入公告》的意见征集通知&#xff08;以下简称“通知”&#xff09;&#xff0c;并在其中公布了抖音外卖服务商入驻的一系列申请条件。在此背景下&#xff0c;许多想要成为抖音本地生活服务商的创业者在关注抖音…

java对象的访问定位的两种方式

句柄访问&#xff1a;reference中存储的稳定&#xff0c;对象实例位置改变&#xff0c;只需要改变句柄池中的对象实例指针 直接指针访问&#xff1a;HotSpot方式&#xff1a;效率高

【实验室优选】PP比色管 带刻度 聚丙烯试管 化学实验专用

PP比色管是一种实验室常用的容器&#xff0c;通常用于化学分析、比色实验、样品储存等。 以下是关于PP比色管的一些基本信息&#xff1a; 1. 材质&#xff1a; PP比色管由聚丙烯&#xff08;Polypropylene&#xff0c;简称PP&#xff09;材料制成&#xff0c;这种材料具有较高…

14-4 深入探究小型语言模型 (SLM)

大型语言模型 (LLM) 已经流行了一段时间。最近&#xff0c;小型语言模型 (SLM) 增强了我们处理和使用各种自然语言和编程语言的能力。但是&#xff0c;一些用户查询需要比在通用语言上训练的模型所能提供的更高的准确性和领域知识。此外&#xff0c;还需要定制小型语言模型&…

汇凯金业:数字货币对经济的影响有哪些

随着信息技术的飞速发展&#xff0c;数字货币作为一种新兴的货币形态&#xff0c;正逐步走进人们的视野&#xff0c;并对传统经济体系产生着深远影响。它不仅革新了交易方式&#xff0c;更在重塑金融格局、赋能经济发展等方面展现出巨大潜力。 一、交易效率的“加速器” 数字…

CentOS 7.9 快速更换 阿里云源教程

CentOS 7.9 更换源教程 总结 # 下载 wget yum -y install wget # 备份 yum 源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak # 下载阿里云的yum源到 /etc/yum.repos.d/ # 此处以 CentOS 7 为例&#xff0c;如果是其它版本或者系统的话&#…

适合职场小白的待办事项管理方法和工具

刚入职场那会儿&#xff0c;我每天都像只无头苍蝇&#xff0c;忙得团团转却效率低下。待办事项像潮水般涌来&#xff0c;会议、报告、客户跟进……每一项都像是悬在头顶的利剑&#xff0c;让我焦虑不堪。我深知&#xff0c;管理好待办事项是职场生存的必修课&#xff0c;但该如…

offer150-19:正则表达式匹配

问题描述&#xff1a;请实现用一个函数来匹配包含 “.” 和 “ * ”的正则表达式。模式中的字符.表示任意一个字符&#xff0c;而 ‘ * ’表示它前面的字符可以出现任意次(含0次&#xff09;。在本题中&#xff0c;匹配是指字符串的所有字符匹配整个模式。例如&#xff0c;字符…

nginx访问图片报403的问题

在安装好nginx后&#xff0c; 编辑/etc/nginx/sites-available/default加上了如下内容&#xff1a; # 图片文件的位置location /images/ {alias /home/lighthouse/images/;autoindex on; # 可选&#xff0c;允许目录列表access_log off; # 可选&#xff0c;禁用访问日志记录…

【人工智能】GPT-5的即将到来:从高中生进化到,,,博士生?

GPT-5的即将到来&#xff1a;从高中生进化到,博士生&#xff1f; 随着近月GPT-4o的出世&#xff0c;OpenAI也在进行一系列的采访和介绍接下来的展望和目标。 在6月22日的采访中&#xff0c;美国达特茅斯工程学院公布了OpenAI首席技术官米拉穆拉蒂的访谈内容。穆拉蒂确认&#…

LaTeX 编辑协作平台 Overleaf 安装和使用教程

在学术界和科技行业&#xff0c;LaTeX 已成为撰写高质量文档的标准工具。然而&#xff0c;传统的 LaTeX 使用体验常常伴随着以下挑战&#xff1a; 学习曲线陡峭环境配置复杂多人协作困难实时预览不便 当然&#xff0c;市面上不乏很多在线 LaTeX 编辑平台&#xff0c;但它们大…

uniapp跨域问题解决

找到menifest文件&#xff0c;在文件的最后添加如下代码&#xff1a; // h5 解决跨域问题"h5":{"devServer": {"proxy": {"/adminapi": {"target": "https://www.demo.com", // 目标访问网址"changeOrigin…

哈喽GPT-4o,对GPT-4o 论文速写的思考与探索

作为一款强大的语言模型&#xff0c;ChatGPT 在论文写作上具备显著优势。它能够辅助学者或研究人员自动创建论文框架、摘要、文献综述及论文段落&#xff08;如引言、方法、结果、结论等&#xff09;。此外&#xff0c;ChatGPT 还能优化论文结构、润色、降低内容重复率&#xf…

SCI一区级 | Matlab实现BO-Transformer-BiLSTM时间序列预测

SCI一区级 | Matlab实现BO-Transformer-BiLSTM时间序列预测 目录 SCI一区级 | Matlab实现BO-Transformer-BiLSTM时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.【SCI一区级】Matlab实现BO-Transformer-BiLSTM时间序列预测&#xff0c;贝叶斯优化Transfor…

【Sklearn-驯化】轻松学会机器学习中的bagging基础模型随机森林的使用技巧

【Sklearn-驯化】轻松学会机器学习中的bagging基础模型随机森林的使用技巧 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容…

CTF常用sql注入(一)联合注入和宽字节

0x01 前言 给自己总结一下sql注入的常用姿势吧&#xff0c;记录一下学习 0x02 联合 联合注入的关键词是union SQL的union联合注入原理是联合两个表进行注入攻击&#xff0c;使用union select关键词来进行联合查询。 那么为什么我们在题目中一般是只写一个呢 因为 $sql &quo…

ID3算法决策树

步骤&#xff1a; 先计算出信息量&#xff1b;信息熵&#xff1b;信息增量&#xff1b; 再比较信息增量的大小&#xff0c;确定分类依据。 信息量&#xff1a; 信息熵&#xff1a; 信息增益&#xff1a;

打印机删除副本以后无法安装打印机驱动

根据知乎文章解决打印机驱动副本存在多个&#xff0c;打印机驱动无法删除&#xff0c;或者驱动包无法删除等问题。的方法删除打印机副本以后发现无论如何也装不上驱动了。 要么驱动安装成功&#xff0c;但是设备仍然是指定状态。 后面发现是删错文件夹了&#xff0c;教程里让删…

上海网站建设如何做

上海是中国最繁华的城市之一&#xff0c;作为全国的经济、文化和科技中心&#xff0c;网站建设在上海变得越来越重要。如何做好上海网站建设&#xff0c;让网站更加吸引人&#xff0c;成为企业和个人宣传自身的重要平台呢&#xff1f; 首先&#xff0c;要有清晰的定位和目标。在…