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.用在定时任务时,如果任务执行时间可能超过下次 ...
随机推荐
- 自上而下的LL(1)语法分析法
LL(1)文法:从文法的开始符,向下推导,推出句子. 对文法G的句子进行确定的自顶向下语法分析的充分必要条件是,G的任意两个具有相同左部的 产生式A->α|β 满足下列条件: (1)如果α.β均 ...
- 梳理Langchain-Chatchat-UI接口文档
在 Langchain-Chatchat v0.1.17 版本及以前是有前后端分离的 Vue 项目的,但是 v0.2.0 后就没有了.所以本文使用的是 Langchain-Chatchat v0. ...
- 编写.NET的Dockerfile文件构建镜像
创建一个WebApi项目,并且创建一个Dockerfile空文件,添加以下代码,7.0代表的你项目使用的SDK的版本,构建的时候也需要选择好指定的镜像tag FROM mcr.microsoft.co ...
- Python——第三章:函数的返回值
函数的返回值: 函数执行之后. 会给调用方一个结果. 这个结果就是返回值 关于return: 函数只要执行到了return. 函数就会立即停止并返回内容. 函数内的return的后续的代 ...
- C++ Qt开发:Charts与数据库组件联动
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍Charts组 ...
- Harbor私有镜像仓库搭建
为什么选择Harbor 你可能会问既然我们已经有了 Docker 镜像仓库为什么还需要 Harbor 呢?嗯,Harbor 是 Docker 镜像仓库的企业级扩展,用途更广泛.这些新的企业级功能包括: ...
- linux内核initcall放置在各个section中函数执行流程
前言 linux以及嵌入式一些代码,我们看到core_initcall.device_initcall等等需要链接器分配各个section,并且在启动该模块时候执行.下面我们详细追溯一下执行过程. 作 ...
- 文心一言 VS 讯飞星火 VS chatgpt (126)-- 算法导论11.1 1题
一.用go语言,假设一动态集合 S用一个长度为 m 的直接寻址表T来表示.请给出一个查找 S 中最大元素的过程.你所给的过程在最坏情况下的运行时间是多少? 文心一言,代码正常运行: 在这个问题中,我们 ...
- C# 将Excel转为OFD、UOS
本文以C#及VB.NET代码为例展示如何将Excel工作簿转换为OFD和UOS格式.通过workbook.LoadFromFile(string fileName)方法加载Excel源文档后,然后调用 ...
- 案例集锦|科技赋能,华为云GaussDB助千行百业数字化转型
当下,全社会驶入数字化转型快车道,以科技赋能.智慧转型为主旨的数字生态推动着千行百业的变革.数据库作为企业核心数据底座,华为云提供了安全可靠的云原生底座和一站式上云解决方案.其中华为云GaussDB覆 ...