ReentrantLock 可重入锁总结
本文为博主原创,未经允许不得转载:
ReentrantLock 是一种内置锁,也叫可重入锁(ReentrantLock),它允许线程再次获取已持有的同步锁,这样防止死锁的发生。在使用ReentrantLock时,需要手动获取和释放同步锁,即使出现异常,也一定要保证每次获取和释放同步锁的次数一致。
ReentrantLock 的主要特点如下:
可重入性:同一线程可以进入获取同步锁,也可以再次获取持有的同步锁。
可中断性:在等待获取同步锁的线程可以响应中断,也就是当线程处于等待获取同步锁的状态时,可以中断等待,它不会永久长时间等待下去。
公平锁:锁获取是公平的,多个线程通过 ReentrantLock 获取锁时,会先进入同步队列中,按照顺序获取同步锁,减少了线程间的竞争。
使用ReentrantLock的步骤:
创建ReentrantLock对象,通过构造方法可以选择公平锁或非公平锁;
在需要同步的代码块中,在使用ReenrantLock的lock()方法获取同步锁,在同步代码块执行完之后必须手动释放同步锁,否则会出现死锁的现象;
对于可能抛出异常的同步代码块,在finally中一定要释放同步锁。
示例代码:
ReentrantLock lock = new ReentrantLock(); // 创建ReentrantLock对象
try {
lock.lock(); // 获取同步锁
// 同步代码块
} finally {
lock.unlock(); // 释放同步锁
}
可重入锁的示例说明
import java.util.concurrent.locks.ReentrantLock;
public class ReentrantLockExample {
private static final ReentrantLock lock = new ReentrantLock();
public static void main(String[] args) {
new Thread(() -> {
lock.lock(); // 获取同步锁
try {
System.out.println(Thread.currentThread().getName() + " 获取锁");
doSomething(); // 调用可重入方法
} finally {
lock.unlock(); // 释放同步锁
}
}, "Thread-1").start();
new Thread(() -> {
lock.lock(); // 获取同步锁
try {
System.out.println(Thread.currentThread().getName() + " 获取锁");
doSomething(); // 调用可重入方法
} finally {
lock.unlock(); // 释放同步锁
}
}, "Thread-2").start();
}
public static void doSomething() {
lock.lock(); // 再次获取同步锁
try {
System.out.println(Thread.currentThread().getName() + " 再次获取锁,并执行业务逻辑");
} finally {
lock.unlock(); // 释放同步锁
}
}
}
在该示例中,创建了一个静态的ReentrantLock对象。两个线程分别获取同步锁,调用了一个可重入方法doSomething(),该方法中又再次获取了同步锁,这样就实现了可重入性。注意,在使用ReentrantLock时,必须手动获取和释放同步锁,避免出现死锁。
ReentrantLock 可重入锁总结的更多相关文章
- ReenTrantLock可重入锁(和synchronized的区别)总结
ReenTrantLock可重入锁(和synchronized的区别)总结 可重入性: 从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也 ...
- ReentrantLock可重入锁的理解和源码简单分析
import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantLock; /** * @author ...
- ReenTrantLock可重入锁和synchronized的区别
ReenTrantLock可重入锁和synchronized的区别 可重入性: 从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入 ...
- JUC 一 ReentrantLock 可重入锁
java.util.concurrent.locks ReentrantLock即可重入锁,实现了Lock和Serializable接口 ReentrantLock和synchronized都是可重入 ...
- java ReentrantLock可重入锁功能
1.可重入锁是可以中断的,如果发生了死锁,可以中断程序 //如下程序出现死锁,不去kill jvm无法解决死锁 public class Uninterruptible { public static ...
- ReentrantLock——可重入锁的实现原理
一. 概述 本文首先介绍Lock接口.ReentrantLock的类层次结构以及锁功能模板类AbstractQueuedSynchronizer的简单原理,然后通过分析ReentrantLock的lo ...
- 40 多线程(十二)——ReentrantLock 可重入锁
我们使用的synchronized加的锁是可以延续使用的,如下: public void test() { //第一次获得锁 synchronized(this) { while(true) { // ...
- ReentrantLock可重入锁、公平锁非公平锁区别与实现原理
ReentrantLock是lock接口的一个实现类,里面实现了可重入锁和公平锁非公平锁 ReentrantLock公平锁和不公平锁实现原理 公平锁会获取锁时会判断阻塞队列里是否有线程再等待,若有获取 ...
- ReentrantLock可重入锁——源码详解
开始这篇博客之前,博主默认大家都是看过AQS源码的~什么居然没看过猛戳下方 全网最详细的AbstractQueuedSynchronizer(AQS)源码剖析(一)AQS基础 全网最详细的Abstra ...
- ReentrantLock可重入锁的使用场景(转)
摘要 从使用场景的角度出发来介绍对ReentrantLock的使用,相对来说容易理解一些. 场景1:如果发现该操作已经在执行中则不再执行(有状态执行) a.用在定时任务时,如果任务执行时间可能超过下次 ...
随机推荐
- LeetCode1806:还原排列的最少操作步数(置换群 or 模拟)
题意:题目的意思是,给定一个初始状态perm,然后对perm的每个元素按照上述的规则进行变换操作.问:perm经过多少次这种操作能够变回初始的perm. 解题思路:第一种方法就是模拟,一直变换,直到变 ...
- 【UniApp】-uni-app-网络请求
前言 经过上个章节的介绍,大家可以了解到 uni-app-pinia存储数据的基本使用方法 那本章节来给大家介绍一下 uni-app-网络请求 的基本使用方法 步入正题 首先我们打开官方文档,我先带着 ...
- CSP_J
- Android本地备份功能禁用
最近部分设备激活客户端后发现本地备份的功能被禁用了,排查原因发现: /** * Allows the device owner to enable or disable the backup serv ...
- 开源易课堂操作手册-yiketang
title: 开源易课堂操作手册 date: 2022-01-05 15:10:43.915 updated: 2023-04-24 10:21:28.476 url: https://www.yby ...
- 对比Spring Boot中的JdbcClient与JdbcTemplate
本文我们一起看看Spring Boot中 JdbcClient 和 JdbcTemplate 之间的差异. 以下内容使用的Java和Spring Boot版本为: Java 21 Spring Boo ...
- VSCode C++开发环境配置: LLVM clang clangd
工欲善其事,必先利其器 llvm/clang 比 VSCode 自带的代码提示功能速度更快,功能更强(支持 clang-tidy). 安装 llvm.clang sudo apt install ll ...
- STM32+华为云IoTDA,带你设计一个属于自己的动态密码锁
摘要:设计一款物联网智能电子密码锁,以STM32单片机为主控制器,由触摸矩阵键盘.ESP8266.步进电机等模块组成,具有远程控制.随机密码生成等功能. 本文分享自华为云社区<STM32+华为云 ...
- Git hooks与自动化部署
好的 commit message 是至关重要的,如果随意编写 log,带来的后果可小可大,但是无论大小都影响了开发的效率和回朔的难度,所以有必要进行 log 规范化检查. 通过自定义的commit ...
- 数据分析引擎百花齐放,为什么要大力投入ClickHouse?
更多技术交流.求职机会.试用福利,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 近年来,OLAP产品的竞争日渐激烈,目前企业间流行的既有Impala.Greenplum等上一代较为成熟 ...