您好,登录后才能下订单哦!
密码登录
            
            
            
            
        登录注册
            
            
            
        点击 登录注册 即表示同意《亿速云用户服务条款》
        # 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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。