Java并发编程之ReentrantLock重入锁原理解析

Java并发编程之ReentrantLock重入锁原理解析

在多线程编程中,同步是一种重要的技术,用于控制对共享资源的并发访问。ReentrantLock是Java并发编程库中的一个重要工具,用于实现互斥访问共享资源的目的。ReentrantLock可以理解为一个可重入的互斥锁,它允许一个线程多次获取同一把锁,避免了在多线程环境中对共享资源的并发访问。

一、ReentrantLock实现

1. 基本原理

ReentrantLock通过内部计数器来记录锁的占用情况。当一个线程尝试获取锁时,会先检查计数器,如果计数器为0,说明锁未被占用,该线程可以获取锁并执行临界区的代码。如果计数器不为0,说明锁已被其他线程占用,该线程将会被阻塞,并将自己加入到等待队列中。当锁的占用者释放锁时,会检查等待队列,唤醒一个等待的线程。

2. 线程阻塞与唤醒机制

当线程请求锁时,如果锁被占用,线程会进入阻塞状态并将自己加入到等待队列中。当锁的占用者释放锁时,会唤醒一个等待的线程。这个过程是通过JVM的Unsafe类来实现的,通过调用park()方法来实现线程的阻塞和唤醒。当调用park()方法时,线程会释放CPU资源并进入阻塞状态,等待其他线程调用unpark()方法来唤醒它。当调用unpark()方法时,等待队列中的线程会被唤醒并尝试获取锁。

3. 公平锁与非公平锁

ReentrantLock有两种类型:公平锁和非公平锁。公平锁按照线程请求锁的顺序分配锁,而非公平锁则没有这个限制。在创建ReentrantLock对象时,可以通过参数来指定是使用公平锁还是非公平锁。

4. 锁状态的改变

ReentrantLock的状态分为四种:公平锁和非公平锁分别有0和1个等待线程两种状态,还有锁定状态和未锁定状态。这些状态的改变需要通过lock()、unlock()、tryLock()等接口进行操作。

二、ReentrantLock工作原理分析

1. 锁的获取与释放

ReentrantLock提供了两种获取锁的方式:lock()和tryLock()。lock()方法会一直阻塞直到获取到锁,而tryLock()方法则会立即返回是否获取到了锁。当一个线程释放锁时,会调用unlock()方法来释放锁,释放后的锁会被加入到等待队列中,等待其他线程来获取。

2. 公平性策略

ReentrantLock支持公平锁和非公平锁两种策略。公平锁按照线程请求锁的顺序分配锁,而非公平锁则没有这个限制。在实现上,公平锁会使用一个FIFO队列来保存等待的线程,而非公平锁则不会。这种策略可以有效地避免“饥饿”问题。

3. 可重入特性

ReentrantLock支持可重入特性,即一个线程可以多次获取同一个锁。在实现上,当一个线程再次获取已经获取的锁时,会直接返回成功状态,而不会进行阻塞。这就意味着同一个线程可以多次获得同一把锁,但每次获取都需要释放,否则会导致死锁。

三、简单Java代码示例

下面是一个使用ReentrantLock实现同步访问的简单示例:

import java.util.concurrent.locks.ReentrantLock;public class ReentrantLockDemo {private final ReentrantLock lock = new ReentrantLock();private int count = 0;public void increment() {lock.lock();  // 获取锁try {count++;  // 修改共享资源} finally {lock.unlock();  // 释放锁}}public int getCount() {return count;  // 返回共享资源值}
}

在这个示例中,我们使用ReentrantLock来保护对count变量的访问。increment()方法使用lock()和unlock()方法来确保在修改count变量的过程中不会被其他线程干扰。getCount()方法返回当前count的值,实现了读写分离。
四、总结

ReentrantLock是Java并发编程库中的一个重要工具,它提供了一种可重入的互斥访问共享资源的方式。通过内部计数器来实现锁的占用情况的记录,同时支持公平锁和非公平锁两种策略以及可重入特性。使用ReentrantLock可以有效地避免并发访问共享资源时的线程安全问题。

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

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

相关文章

MFC ExtTextOut函数学习

ExtTextOut - 扩展的文本输出; win32 api的声明如下; ExtTextOut( DC: HDC; {设备环境句柄} X, Y: Integer; {起点坐标} Options: Longint; {选项} Rect: PRect; {指定显示范围; 0 表示限制范围} Str: PChar; {字符串…

java基础 日期工具类

目录结构: DateUtils.java package dateStudy; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;public class DateUtils {private static final String FORMAT_1"yyyy-MM-dd HH:mm:ss";//私有方法&#xf…

C++内存管理:其三、new和delete的行为拆分

new和delete都是C的关键字&#xff0c;不可重载。其底层的行为可以看作多个函数的组合。 一、自己实现new与delete的功能 #include <iostream> using namespace std;class Student{ private:int age{24}; public:Student(){cout<<"start"<<endl;…

在Ubuntu中批量创建用户

一、背景知识 在Linux操作系统中创建新用户可以使用useradd或adduser命令。 使用useradd命令创建用户时&#xff0c;不会在/home目录下创建用户文件夹&#xff0c;需要用户自己指定主目录和bash目录的位置。同时&#xff0c;创建的用户没有设置密码&#xff0c;无法进行登录&a…

复旦大学EMBA王世峰:坚持科技创造与品质,铸就“中国智造”梦!

当前&#xff0c;新能源产业呈现持续爆发式增长趋势&#xff0c;2023年《政府工作报告》对汽车行业提出“扩大消费绿色发展”的指导方向。动力电池是新能源汽车核心概念&#xff0c;对新能源汽车的性能和品质起着决定性作用。锂离子电池在电动汽车、电动飞行器、储能等领域的应…

基于SpringBoot的精准扶贫管理系统

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 贫困户信息管理 新闻类型管理 志愿者招聘管理 志愿者招聘 留言反馈管理 贫困户 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息…

JavaScript Web APIs第五天笔记

Web APIs - 第5天笔记 目标&#xff1a; 能够利用JS操作浏览器,具备利用本地存储实现学生就业表的能力 BOM操作综合案例 js组成 JavaScript的组成 ECMAScript: 规定了js基础语法核心知识。比如&#xff1a;变量、分支语句、循环语句、对象等等 Web APIs : DOM 文档对象模型&…

使用DNS查询Web服务器IP地址

浏览器并不具备访问网络的功能&#xff0c;其最终是通过操作系统实现的&#xff0c;委托操作系统访问服务器时提供的并不是浏览器里面输入的域名而是ip地址&#xff0c;因此第一步需要将域名转换为对应的ip地址 域名&#xff1a;www.baidu.com ip地址是一串数字 tcp/ip的网络结…

【Vue】vscode格式刷插件Prettier以及配置项~~保姆级教程

文章目录 前言一、下载插件二、在项目内创建配置文件1.在根目录创建&#xff0c;src同级2.写入配置3.每个字段含义 总结 前言 vscode格式刷&#xff0c;有太多插件了&#xff0c;但是每个的使用&#xff0c;换行都不一样。 这里我推荐一个很多人都推荐了的Prettier 一、下载插…

数据采集项目之业务数据(三)

1. Maxwell框架 开发公司为Zendesk公司开源&#xff0c;用java编写的MySQL变更数据抓取软件。内部是通过监控MySQL的Binlog日志&#xff0c;并将变更数据以JSON格式发送到Kafka等流处理平台。 1.1 MySQL主从复制 主机每次变更数据都会生成对应的Binlog日志&#xff0c;从机可…

多路彩灯控制器LED流水灯花型verilog仿真图视频、源代码

名称&#xff1a;多路彩灯控制器LED流水灯花型verilog 软件&#xff1a;Quartus 语言&#xff1a;Verilog 代码功能&#xff1a; 用quartus和modelism&#xff0c;设计一个多路彩灯控制器&#xff0c;能够使花型循环变化&#xff0c;具有复位清零功能&#xff0c;并可以选择…

Flutter 打包 windows桌面端可执行文件

简单一说 因为个人兴趣爱好&#xff0c;在写一个跨平台工具。为了省事没去官网看文档&#xff0c;直接翻阅各大博客网站&#xff0c;一个简单的命令&#xff0c;博客写的内容比较复杂。为了方便自己和有需要同学&#xff0c;简单做一个记录。 Flutter提供了一种方便命令行的方…

后台开发核心技术与应用实践看书笔记(一):C++编程常用技术

C编程常用技术 第一个C程序函数函数模板 数组字符数组 指针概念数组与指针字符串与指针函数与指针 引用引用作为参数常引用 结构体&#xff0c;公用体&#xff0c;枚举共用体枚举结构体&#xff0c;共用体在内存单元占用字节数的计算 预处理常用宏定义命令do while(0)的妙用条件…

【gitlab】从其他仓库创建项目

需求描述 解决方法 以renren-fast脚手架为例 第一步 第二步 第三步 第四步 参考文章

【面试】pc寄存器题

目录 1.使用pc寄存器存储字节码指令地址有什么作用&#xff1f;&#xff08;为什么使用pc寄存器记录当前线程的执行地址&#xff1f;&#xff09;2.pc寄存器为什么被设定为线程私有的&#xff1f; 1.使用pc寄存器存储字节码指令地址有什么作用&#xff1f;&#xff08;为什么使…

应用层协议 HTTP

一、应用层协议 我们已经学过 TCP/IP , 已然知道数据能从客户端进程经过路径选择跨网络传送到服务器端进程。 我们还需要知道的是&#xff0c;我们把数据从 A 端传送到 B 端&#xff0c; TCP/IP 解决的是顺丰的功能&#xff0c;而两端还要对数据进行加工处理或者使用&#xf…

算法-二叉树

1. 二叉树定义 二叉树是一种常见的树状数据结构&#xff0c;它由节点组成&#xff0c;每个节点最多有两个子节点&#xff0c;通常称为左子节点和右子节点。二叉树的定义如下&#xff1a; 节点&#xff08;Node&#xff09;&#xff1a;每个节点包含一个数据元素&#xff08;通…

python常用库之数据库orm框架之SQLAlchemy

文章目录 python常用库之数据库orm框架之SQLAlchemy一、什么是SQLAlchemySQLAlchemy 使用场景 二、SQLAlchemy使用SQLAlchemy根据模型查询SQLAlchemy SQL 格式化的方式db_session.query和 db_session.execute区别实测demo 总结&#xff1a;让我们留意一下SQLAlchemy 的 lazy lo…

SpringMVC的视图

文章目录 1. ThymeleafView2. 转发视图3. 重定向视图4. 视图控制器view-controller5. 总结6. 荐书 SpringMVC中的视图是View接口&#xff0c;视图的作用渲染数据&#xff0c;将模型Model中的数据展示给用户SpringMVC视图的种类很多&#xff0c;默认有转发视图和重定向视图 当工…

二维反射容斥:P9366

https://www.luogu.com.cn/problem/P9366 构造循环矩阵&#xff0c;考虑反射容斥和将军饮马 考虑二维不太好做&#xff0c;我们曼哈顿距离转切比雪夫距离&#xff0c;变成一维的情况。 由于棋盘是正方形的&#xff0c;所以循环长度为 2 n 4 2n4 2n4。用多项式快速幂预处理&…