ReentrantLock 是可中断锁,是因为他提供了一个 tryLock(long timeout, TimeUnit unit) 方法,这个方法可以让线程在给定的时间内尝试去获取锁,如果在指定的时间内没有获取到锁,就可以中断尝试获取锁的线程。举个代码例子
时间: 2023-05-27 20:01:53 浏览: 100
ReentrantLock代码剖析之ReentrantLock_lock
:```
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
public class InterruptibleLockDemo {
private static ReentrantLock lock = new ReentrantLock();
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try {
// 在5秒内尝试获取锁,如果获取不到则中断线程
lock.tryLock(5, TimeUnit.SECONDS);
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName() + " is interrupted.");
return;
}
System.out.println(Thread.currentThread().getName() + " got the lock.");
lock.unlock();
}
}, "ThreadA");
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
lock.lock();
System.out.println(Thread.currentThread().getName() + " got the lock.");
lock.unlock();
}
}, "ThreadB");
// 先启动t2,让其获取到锁
t2.start();
// 等待1秒后再启动t1尝试获取锁
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t1.start();
// 等待t1结束
try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 中断t1
t1.interrupt();
}
}
```
在这个例子中,我们先启动了一个线程 t2,让其获取到锁。然后等待1秒后再启动一个线程 t1,让其在5秒内尝试获取锁。由于 t2 已经持有锁,t1 尝试获取锁会被阻塞。3秒后,我们中断 t1,它会抛出 InterruptedException,并且不会执行后面的释放锁的操作。最终,我们看到 t1 没有获取到锁,而 t2 成功获取到锁并释放了锁。
阅读全文