使用ReentrantLock
2023-02-18 15:31:08 时间
从Java 5开始,引入了一个高级的处理并发的java.util.concurrent
包,它提供了大量更高级的并发功能,能大大简化多线程程序的编写。
我们知道Java语言直接提供了synchronized
关键字用于加锁,但这种锁一是很重,二是获取时必须一直等待,没有额外的尝试机制。
java.util.concurrent.locks
包提供的ReentrantLock
用于替代synchronized
加锁,我们来看一下传统的synchronized
代码:
public class Counter {
private int count;
public void add(int n) {
synchronized(this) {
count += n;
}
}
}
如果用ReentrantLock
替代,可以把代码改造为:
public class Counter {
private final Lock lock = new ReentrantLock();
private int count;
public void add(int n) {
lock.lock();
try {
count += n;
} finally {
lock.unlock();
}
}
}
因为synchronized
是Java语言层面提供的语法,所以我们不需要考虑异常,而ReentrantLock
是Java代码实现的锁,我们就必须先获取锁,然后在finally
中正确释放锁。
顾名思义,ReentrantLock
是可重入锁,它和synchronized
一样,一个线程可以多次获取同一个锁。
和synchronized
不同的是,ReentrantLock
可以尝试获取锁:
if (lock.tryLock(1, TimeUnit.SECONDS)) {
try {
...
} finally {
lock.unlock();
}
}
上述代码在尝试获取锁的时候,最多等待1秒。如果1秒后仍未获取到锁,tryLock()
返回false
,程序就可以做一些额外处理,而不是无限等待下去。
所以,使用ReentrantLock
比直接使用synchronized
更安全,线程在tryLock()
失败的时候不会导致死锁。
小结
ReentrantLock
可以替代synchronized
进行同步;
ReentrantLock
获取锁更安全;
必须先获取到锁,再进入try {...}
代码块,最后使用finally
保证释放锁;
可以使用tryLock()
尝试获取锁。
相关文章
- 鱼跃医疗:遭遇“滑铁卢”
- 9000字详解数据治理和数据分类分级
- 数据仓库:详解维度建模之事实表
- CAD2016软件安装教程(一款强大的工程制图软件)--cad所有版本!
- CAD2015软件安装教程(一款强大的工程制图软件)--cad所有版本!
- 智慧城市赛道中的昇腾AI:在深圳龙岗勾勒新图景
- CAD2014软件安装教程(一款强大的工程制图软件)--cad所有版本!
- Dapr 入门教程之中间件
- 开源云原生平台 KubeSphere 与 Rainbond 对比
- Dapr 安全性之访问控制策略
- Logstash、Fluentd、Fluent Bit 还是 Vector?如何选择合适的开源日志收集器
- PS CC 2018软件安装教程PS全版本软件下载地址(包括最新的2023)
- CAD制图安装包下载AutoCAD 2014软件安装包资源免费下载以及安装教程
- CAD制图安装包下载AutoCAD 2012软件安装包资源免费下载以及安装教程
- Photoshop 2021安装教程 PS全版本软件下载地址(包括最新的2023)
- CAD制图安装包下载AutoCAD 2013软件安装包资源免费下载以及安装教程
- Photoshop 2020安装教程 PS全版本软件下载地址(包括最新的2023)
- Adobe Photoshop CC 2019最新版软件已更新(可下载)
- CAD2007软件安装教程(一款强大的工程制图软件)--cad所有版本!
- CAD2010软件安装教程(一款强大的工程制图软件)--cad所有版本!