我想知道是否有现有的替代方案,或者如何在 Java 5 之前实现 java.util.concurrent.locks.Lock#tryLock() 的语义。如果锁被锁定,则可以立即退出。已被另一个线程持有。
如果您需要
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
实现也更高效……)