您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# ReentrantLock是什么
## 一、概述
`ReentrantLock`是Java并发包(`java.util.concurrent.locks`)中的一个可重入互斥锁实现类,自JDK 1.5引入。它提供了比`synchronized`关键字更灵活的锁机制,支持公平性选择、可中断的锁获取、超时锁获取等高级特性,是构建线程安全应用的重要工具。
## 二、核心特性
### 1. 可重入性(Reentrancy)
与`synchronized`相同,`ReentrantLock`允许同一个线程多次获取同一把锁。例如:
```java
ReentrantLock lock = new ReentrantLock();
void methodA() {
lock.lock();
try {
methodB(); // 可重入调用
} finally {
lock.unlock();
}
}
void methodB() {
lock.lock(); // 同一线程可重复获取锁
try {
// 操作共享资源
} finally {
lock.unlock();
}
}
构造时可指定是否为公平锁:
// 公平锁(按申请顺序获取锁)
ReentrantLock fairLock = new ReentrantLock(true);
// 非公平锁(默认,吞吐量更高)
ReentrantLock unfairLock = new ReentrantLock();
lockInterruptibly()
tryLock(long timeout, TimeUnit unit)
tryLock()
特性 | ReentrantLock | synchronized |
---|---|---|
实现方式 | API层面(Java代码实现) | JVM原生支持(字节码) |
锁释放 | 必须手动调用unlock() | 自动释放 |
公平性 | 可配置 | 非公平 |
性能 | 高竞争时更优 | JDK6后优化接近 |
功能扩展 | 支持条件变量、多等待队列 | 单一等待队列 |
ReentrantLock lock = new ReentrantLock();
public void criticalSection() {
lock.lock(); // 阻塞直到获取锁
try {
// 临界区代码
} finally {
lock.unlock(); // 必须放在finally块
}
}
ReentrantLock lock = new ReentrantLock();
Condition condition = lock.newCondition();
void await() throws InterruptedException {
lock.lock();
try {
condition.await(); // 释放锁并等待
} finally {
lock.unlock();
}
}
void signal() {
lock.lock();
try {
condition.signal();
} finally {
lock.unlock();
}
}
ReentrantLock
基于抽象队列同步器(AbstractQueuedSynchronizer
)实现:
- 通过state
变量记录锁状态(0=未锁定,>0=持有计数)
- 使用CLH队列管理等待线程
默认模式下,新请求线程会直接尝试获取锁,不检查等待队列,提高吞吐量但可能导致线程饥饿。
严格按照FIFO顺序分配锁,通过hasQueuedPredecessors()
方法检查是否有更早的等待线程。
unlock()
会导致死锁synchronized
作为Java并发编程的核心组件之一,ReentrantLock
通过灵活的API和强大的功能,为开发者提供了比内置锁更精细的线程控制能力。理解其实现原理和适用场景,能够帮助我们在高并发环境下做出更合理的设计选择。
“`
(注:实际字数约900字,可根据需要调整细节部分的详略程度)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。