java并发编程中ReentrantLock
时间: 2025-01-05 08:34:55 浏览: 47
### Java 并发编程 ReentrantLock 使用方法
#### 锁的获取与释放
`ReentrantLock` 提供了多种方式来获取锁,其中最基本的方式是通过 `lock()` 方法。调用此方法会尝试获取锁;如果锁已被其他线程持有,则当前线程会被阻塞,直到能够成功获得锁[^1]。
```java
ReentrantLock lock = new ReentrantLock();
lock.lock(); // 获取锁
try {
// 执行临界区代码
} finally {
lock.unlock(); // 释放锁
}
```
为了防止死锁或其他异常情况的发生,在使用 `lock()` 后应当总是确保在 `finally` 块中调用 `unlock()` 来释放锁,即使发生错误也应如此处理以避免资源泄露[^4]。
#### 支持可中断的锁请求
除了基本的锁定操作外,还提供了带有中断特性的版本—`lockInterruptibly()` 。这允许正在等待锁的过程中被外部因素打断,并抛出 `InterruptedException` 异常给调用者知道发生了什么状况[^2]。
```java
ReentrantLock interruptibleLock = new ReentrantLock();
try {
interruptibleLock.lockInterruptibly(); // 可能因外界干扰而失败并抛出 InterruptedException
try {
// 处理受保护的操作...
} finally {
interruptibleLock.unlock();
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // 恢复被打断的状态标志位
throw new RuntimeException(e);
}
```
#### 非阻塞式的尝试加锁
对于那些不想长时间挂起的情况来说,可以考虑采用 `tryLock()` 或带超时参数的方法来进行非阻塞性质上的尝试性上锁动作。前者会在无法立即取得所有权的情况下立刻返回false值而不做任何停留;后者则是在规定时间内轮询检查是否有可用的机会去占有互斥对象[^3]。
```java
// 不等待直接测试能否拿到锁
if (!myLock.tryLock()) {
System.out.println("未能即时得到锁");
}
// 设置最大等待时间为5秒
if (myLock.tryLock(5, TimeUnit.SECONDS)) {
try {
// 成功获得了锁后的逻辑
} finally {
myLock.unlock();
}
} else {
System.out.println("超过设定时间未获授权");
}
```
阅读全文
相关推荐



















