Java并发编程中的ReentrantLock详解
Java ReentrantLock
从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是可重入锁,它和synchronized一样,一个线程可以多吃获取同一个锁。
和synchronized不同的是,ReentrantLock可以尝试获取锁:
if(lock.tryLock(1,TimeUnit.SECONDS)){
try{
...
}finally{
lock.unlock();
}
}
上述代码在尝试获取锁的时候,最多等待1秒
后仍未获取到锁,tryLock()返回false,程序就可以做一些额外处理的,而不是无限等待下去。
所以,使用ReentranLock比直接使用synchronized更安全,线程在tryLock()失败的时候不会导致死锁。
到此这篇关于Java并发编程中的ReentrantLock详解的文章就介绍到这了,更多相关ReentrantLock详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
基于 SASL/SCRAM 让 Kafka 实现动态授权认证的方法
在大数据处理和分析中 Apache Kafka 已经成为了一个核心组件,本文将从零开始部署 ZooKeeper 和 Kafka 并通过配置 SASL/SCRAM 和 ACL(访问控制列表)来增强 Kafka 的安全性,需要的朋友可以参考下2024-07-07
java连接池Druid获取连接getConnection示例详解
这篇文章主要为大家介绍了java连接池Druid获取连接getConnection示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-09-09
Springboot Websocket Stomp 消息订阅推送
本文主要介绍了Springboot Websocket Stomp 消息订阅推送,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2021-07-07
idea2020.1版本git提交项目到github上的方法
这篇文章主要介绍了idea2020.1版本git提交项目到github上的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2020-06-06


最新评论