【问题标题】:Alternative to Lock.tryLock() in Java 1.4Java 1.4 中 Lock.tryLock() 的替代方案
【发布时间】:2014-06-03 16:32:24
【问题描述】:

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

【问题讨论】:

  • 只是出于好奇:您为什么需要 Java 2 (1.4) 的解决方案(Java 5 和 6 已经不支持)?
  • 好吧,出于好奇 :) 我现在特别不需要它,但我知道有很多 Java 1.4 项目可以利用它。
  • 澄清一下:我过去遇到过这个问题,我相信它可以帮助其他人。实际上它已经有一个赞成票。

标签: java multithreading concurrency synchronization


【解决方案1】:

如果您需要支持tryLock 操作的Lock,则不能使用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();
    }
  }
}

请注意,synchronized 方法强制执行的 Lock 实例的内在锁定仅保持很短的时间。线程要么立即返回,要么进入wait 状态,这意味着也释放锁。因此,tryLock 将表现出所需的行为,尽管 Java 5 和更新的等效版本可能会更有效。 (synchronized 的 Java 5 和更新的实现也更高效……)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 2013-03-10
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多