深入理解ReentrantLock

深入理解ReentrantLock

在Java并发编程中,锁(Lock)是控制多个线程对共享资源访问的重要工具。虽然Synchronized关键字是实现锁的常用方式,但它在功能上比较有限。ReentrantLockjava.util.concurrent.locks包中提供的一个更加灵活和强大的锁实现,它是一个可重入的互斥锁,它允许线程在获取锁之后再次获取该锁而不被阻塞。简单来说,如果一个线程已经持有了一个锁,再次请求获取该锁时,它可以成功获取而不会被阻塞。

ReentrantLock的基本用法

使用ReentrantLock的基本步骤包括创建锁实例、加锁和解锁。以下是一个简单的例子:

import java.util.concurrent.locks.ReentrantLock;public class ReentrantLockExample {private final ReentrantLock lock = new ReentrantLock();public void performTask() {lock.lock();try {// 关键代码段System.out.println("Lock is held by: " + Thread.currentThread().getName());} finally {lock.unlock();}}public static void main(String[] args) {ReentrantLockExample example = new ReentrantLockExample();Runnable task = () -> example.performTask();Thread t1 = new Thread(task, "Thread-1");Thread t2 = new Thread(task, "Thread-2");t1.start();t2.start();}
}

在这个例子中,我们创建了一个ReentrantLock实例,并在performTask方法中使用lock.lock()来获取锁,lock.unlock()来释放锁。在try块中执行关键代码以确保在任何情况下都会释放锁。

ReentrantLock的高级功能

可重入性

正如前面提到的,ReentrantLock是可重入的。这意味着同一个线程可以多次获取同一个锁而不会陷入死锁。以下示例展示了这一特性:

public void reentrantLockExample() {lock.lock();try {System.out.println("First lock acquired.");lock.lock();try {System.out.println("Second lock acquired.");} finally {lock.unlock();}} finally {lock.unlock();}
}

公平锁与非公平锁

ReentrantLock可以被配置为公平锁或非公平锁。公平锁意味着线程将以请求锁的顺序(FIFO)获得锁,而非公平锁则可能让某些线程“插队”。默认情况下,ReentrantLock是非公平的。要创建公平锁,可以使用以下代码:

ReentrantLock fairLock = new ReentrantLock(true);

可中断锁获取

ReentrantLock提供了一种机制,可以让线程在尝试获取锁时被中断。使用lock.lockInterruptibly()方法,可以在获取锁的过程中响应中断:

public void performInterruptibleTask() {try {lock.lockInterruptibly();try {// 关键代码段} finally {lock.unlock();}} catch (InterruptedException e) {Thread.currentThread().interrupt();// 处理中断}
}

超时锁获取

ReentrantLock还允许在获取锁时指定超时时间。如果在指定时间内无法获取锁,线程将会放弃获取锁的尝试:

public void performTimedTask() {try {if (lock.tryLock(5, TimeUnit.SECONDS)) {try {// 关键代码段} finally {lock.unlock();}} else {System.out.println("Could not acquire lock within 5 seconds");}} catch (InterruptedException e) {Thread.currentThread().interrupt();// 处理中断}
}

ReentrantLock与Synchronized的对比

灵活性

ReentrantLockSynchronized更加灵活,提供了可中断的锁获取、超时锁获取和公平锁等特性。而Synchronized则相对简单,只能用于基本的互斥锁定。

性能

在高竞争环境下,ReentrantLock可能表现得比Synchronized更好,因为它内部使用了一些优化策略,比如自旋锁。

可见性

ReentrantLock提供了isHeldByCurrentThread()等方法,可以方便地检测锁的状态,而Synchronized则没有这种直接的方法。

参考链接

  • Java 官方并发教程
    在这里插入图片描述

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

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

相关文章

FreeRTOS移植:STM32L476 nucleo-L476RG 开发板《02》

系列文章 FreeRTOS移植:STM32L476 nucleo-L476RG 开发板《01》 说明 上一篇 FreeRTOS移植:STM32L476 nucleo-L476RG 开发板《01》 主要讲了一下如何快速搭建一个 STM32 裸机工程,其实 STM32CubeMX 可以生成 FreeRTOS 的工程,这就…

C语言小例程20/100

题目&#xff1a;一个数如果恰好等于它的因子之和&#xff0c;这个数就称为"完数"。例如61&#xff0b;2&#xff0b;3.编程找出1000以内的所有完数。 #include<stdio.h> #define N 1000 int main() {int i,j,k,n,sum;int a[256];for(i2;i<N;i){suma[0]1;k…

异常封装类统一后端响应的数据格式

异常封装类 如何统一后端响应的数据格式 1. 背景 后端作为数据的处理和响应&#xff0c;如何才能和前端配合好&#xff0c;能够高效的完成任务&#xff0c;其中一个比较重要的点就是后端返回的数据格式。 没有统一的响应格式&#xff1a; // 第一种&#xff1a; {"dat…

水表摄像直读抄表仪

1.技术性简述 水表摄像直读抄表仪&#xff0c;是一种前沿的智能计量机器设备&#xff0c;它利用超清摄像头部和图像识别算法&#xff0c;完成了远程控制、非接触的水表载入。这一技术的普及&#xff0c;颠覆了传统式人力抄表的形式&#xff0c;提高了效率&#xff0c;降低了不…

upload-labs第八关教程

upload-labs第八关教程 一、源代码分析代码审计 二、绕过分析点绕过上传eval.php使用burp suite进行抓包修改放包&#xff0c;查看是否上传成功使用中国蚁剑进行连接 一、源代码分析 代码审计 $is_upload false; $msg null; if (isset($_POST[submit])) {if (file_exists(U…

从开源EPR产品Odoo学习

前言 一个先进、敏捷、经济高效、可快速扩展的Odoo免费开源企业信息化解决方案,让企业获得适应未来发展的长期创新和增长能力。 Odoo 的免费开源模式 让我们可利用无数开发人员和业务专家,在短短数年内,打造数百款应用。凭借强大的技术基础,Odoo 的框架是非常独特且优秀的…

中小制造业工厂要不要上MES系统

MES系统的主要功能包括制造数据管理、计划排产管理、生产调度管理、库存管理、质量管理、人力资源管理、工作中心/设备管理、工具工装管理、采购管理、成本管理、项目看板管理、生产过程控制、底层数据集成分析、上层数据集成分解等。通过这些模块&#xff0c;MES为企业打造一个…

C51学习归纳13 --- AD/DA转换

AD/DA转换实现了计算机和模拟信号的连接&#xff0c;扩展了计算机的应用场景&#xff0c;为模拟信号数字化提供了底层支持。 AD转换通常是多个输入通道&#xff0c;使用多路选择器连接到AD开关&#xff0c;实现AD多路复用的目的&#xff0c;提高利用率。 AD/DA转换可以使用串口…

【已解决】引入 element 组件无法使用编译错误 ERROR Failed to compile with 1 error

如果大家使用这个vue 配合 element 框架不熟练&#xff0c;当你顺利按照文档安装好 vue 和 element 的时候想要使用element 的组件时候确无法展示出来&#xff0c;甚至报错。不妨看看是不是这个问题&#xff0c; 1.首先使用element 的时候&#xff0c;前提是把必须要的 elemen…

VictoriaMetrics的高可用二进制方式部署

参考文章实现&#xff1a;Prometheus联邦集群VictoriaMetrics集群搭建部署 1.基本信息 涉及机器列表&#xff0c;机器均为本地虚拟机 192.168.56.108 192.168.56.109方案实现如下 涉及模块介绍 vmstorage: 数据存储节点&#xff0c;负责存储时序数据vmselect: 数据查询节点…

upload-labs第九关教程

upload-labs第九关教程 一、源代码分析代码审计::$DATA介绍 二、绕过分析特殊字符::$data绕过上传eval.php使用burpsuite抓包进行修改放包&#xff0c;查看是否上传成功使用中国蚁剑进行连接 一、源代码分析 代码审计 $is_upload false; $msg null; if (isset($_POST[submi…

关闭kylin(麒麟)系统的安全认证(烦人的安全认证)

打开grub sudo vim /etc/default/grup修改安全认证选项 增加12行&#xff0c;把13行注释掉 保存更改, 然后执行下面的命令&#xff1a; sudo sync sudo reboot重启成功后&#xff0c;就关闭了安全认证了~~~~~。 总体来讲&#xff0c;kylin还是基于ubuntu的内核的&#xff0c;…

图解Transformer学习笔记

教程是来自https://github.com/datawhalechina/learn-nlp-with-transformers/blob/main/docs/ 图解Transformer Attention为RNN带来了优点&#xff0c;那么有没有一种神经网络结构直接基于Attention构造&#xff0c;而不再依赖RNN、LSTM或者CNN的结构&#xff0c;这就是Trans…

【网络编程】域名及网络地址

DNS(Domain Name System&#xff0c;域名系统)&#xff0c;是对IP地址和域名进行互相转换的系统&#xff0c;其核心是DNS服务器。 域名&#xff1a;提供网络服务的服务器端也是通过IP地址去份额&#xff0c;但IP地址难记&#xff0c;因此将容易记、易表述的域名分配并取代IP地…

186.二叉树:二叉搜索树中的插入操作(力扣)

代码解决 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* Tre…

PMS助力制造企业高效运营︱PMO大会

全国PMO专业人士年度盛会 北京易贝恩项目管理科技有限公司副总经理朱洪泽女士受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“PMS助力制造企业高效运营”。大会将于6月29-30日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1a; …

音频处理软件adobe audition使用教程

基本操作 点击文件-》新建-》多轨会话&#xff1a; 编辑-》首选项&#xff0c;设置自动保存时间&#xff1a; 导入素材&#xff0c;文件-》导入素材&#xff0c;或者直接拖动进来文件&#xff01; 导出多轨混音&#xff1a; 更改为需要导出的格式wav,mp3等格式&#xff0c;码…

【触想智能】壁挂式工业一体机在智能制造行业上的应用分析

随着智能制造的兴起&#xff0c;壁挂式工业一体机成为了越来越多工厂的首选设备。壁挂式工业一体机是一种高性能的计算机&#xff0c;内置多种工业级传感器和执行器&#xff0c;可以实时获取工厂生产过程中的各种数据&#xff0c;并与其他设备进行无缝连接。 为了大家更深入的了…

一文读懂数字化转型三部曲:信息化-数字化-数智化

言简意赅&#xff0c;数字化就是把物理实体、业务流程和信息数据转换为数字形式&#xff0c;比如原本公司的账都记在纸质账本上&#xff0c;堆在仓库里&#xff0c;通过“数字化”&#xff0c;这些账本就被存入了线上的仓库里。而数智化则更加注重对数据的分析和利用&#xff0…

方案开发 2.4G儿童遥控漂移车 东莞酷得

电子方案开发定制&#xff0c;我们是专业的 东莞酷得智能单片机方案之2.4G遥控玩具童车具有以下比较有特色的特点&#xff1a; 1、内置充电电池&#xff1a;这款小车配备了可充电的电池&#xff0c;无需频繁更换电池&#xff0c;既环保又方便。充电方式可能为USB充电或者专用…