Java 1.4中Lock.tryLock()的替代方法

时间:2014-06-03 16:32:25

标签: java multithreading concurrency synchronization

我想知道是否存在现有的替代方法或如何在Java 5之前实现java.util.concurrent.locks.Lock#tryLock()的语义。如果锁已被另一个线程持有,则可以立即退出。

1 个答案:

答案 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实现也更有效......)