当前位置: 首页 > 面试题库 >

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

林修真
2023-03-14
问题内容

我想知道是否存在现有的替代方法,或者如何在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可能会更有效,但它们将表现出所需的行为。(Java 5和更高版本的实现synchronized也更加有效…)



 类似资料:
  • 我一直在通过Netbeans使用CodeNameOne设计一个应用程序,并遇到了一些问题,特别是“找不到符号”编译错误。经过进一步的研究,我发现这是由于CNO不支持某些库/杂项。 我想知道是否有其他方法可以使用以下库/执行任务: (从文件读取)导入java.io.file;符号:类文件位置:package java.io (抛出FileNotFoundException)导入java.io.Fil

  • 问题内容: 我从没想过会发生这种情况,但是遇到了我的第一个Java错误: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5003595 我几乎与错误(在Linux上为NFS)中描述的情况完全相同,并且我看到File.exists()没有返回正确的值(至少不是立即返回)。 所以我的问题是,这种检查文件是否存在的方法是否可以替代?如果可能的话,我

  • 问题内容: 在JavaScript中,不支持本机JSON的浏览器有哪些替代方案?谢谢 问题答案: 您应该使用该库。它是某些浏览器本地包含的标准的基础。 您可以在这里找到它起源的页面:https : //github.com/douglascrockford/JSON- js/blob/master/json2.js 该脚本会自动确保仅在尚不存在的情况下添加方法,因此在具有该方法的浏览器中不会存在危

  • 问题内容: 我试图在Android中实现算法AES 128,但是它不起作用,问题是 和 是否存在替代方案? 我的方法: 我看到了其他答案,但是无法实现解决方案。 问题答案: 解 我用解决了我的问题 我将android.util.Base64用于Android 不兼容 / 替换

  • 问题内容: PHP_excel是否有其他选择可以以自定义格式“导出到XLSX / XLS”文件? 问题答案: 我编写了一个非常简单的类,用于导出到“ Excel XML”(又名SpreadsheetML)。对于最终用户而言,它不如XSLX方便(取决于文件扩展名和Excel版本,他们可能会收到警告消息),但使用起来比XLS或XLSX容易得多。

  • 问题内容: 对于像 制作视频的人相信 在许多情况下,冬眠过大 基本的sql是一种很好的语言,它可以将很多冬眠抽象化 我想听听他们如何比较,以及每个人的优缺点。 问题答案: 在这里,您可以找到Java ORM和持久性解决方案的详尽列表。并非所有以下Hibernate / JPA方法都遵循,其中某些方法在设计上相当容易。 当然,该站点上没有列出解决方案,例如带有模板的Spring JDBC等 。对于需