我想知道是否存在现有的替代方法或如何在Java 5之前实现java.util.concurrent.locks.Lock#tryLock()的语义。如果锁已被另一个线程持有,则可以立即退出。
答案 0 :(得分:3)
如果需要Lock
支持tryLock
操作,则不能使用Java的内部锁定功能。您必须实现自己的Lock
类来维护所需的状态,即所有者Thread
和计数器,并且可能使用内部锁定来实现线程安全更新和阻塞(没有在较旧的Java版本中有很多替代方案。)
一个非常简单的实现可能如下所示:
public final class Lock {
private Thread owner;
private int nestCount;
public synchronized void lock() throws InterruptedException {
for(;;) {
if(tryLock()) return;
wait();
}
}
public synchronized boolean tryLock() {
Thread me=Thread.currentThread();
if(owner!=me) {
if(nestCount!=0) return false;
owner=me;
}
nestCount++;
return true;
}
public synchronized void unlock() {
if(owner!=Thread.currentThread())
throw new IllegalMonitorStateException();
if(--nestCount == 0) {
owner=null;
notify();
}
}
}
请注意,Lock
方法强制执行的synchronized
实例的内部锁定仅在很短的时间内保留。线程将立即返回或进入wait
状态,这意味着也会释放锁。因此tryLock
将表现出所需的行为,尽管Java 5和更新的等价物可能会更有效。 (Java {5和更新的synchronized
实现也更有效......)