繁体   English   中英

Java Flight Recorder 中的 ReentrantLock

[英]ReentrantLock in Java Flight Recorder

ReentrantLock 使用什么样的机制? 我试图了解它会在 Java 飞行记录下显示的位置。 我的期望是锁定将位于Java Monitor Wait部分下,但似乎并非如此。

背景:
我正在尝试通过捕获 Java 飞行记录来调试有问题的 ReentrantLock。 锁本身非常简单:

public class SomeClass {
  private final ReentrantLock lock = new ReentrantLock();
  
  public void capture() {
    boolean exclusive = someFunction();
    try {
      if (exclusive) {
        lock.lock();
      }  

      // critical code 

    } finally {
      if (exclusive) {
        lock.unlock();  
      }
    }
  }
}

在我的实验中,我的应用程序应该调用capture函数 200 万次,在某些情况下,锁会根据someFunction()被激活。 由于我没有得到预期的结果,我将函数硬编码为始终为真,但没有在我的记录中观察到 200 万个 Java Monitor Waiting 事件。

祖鲁任务控制截图

ReentrantLocks 不使用 Java 内部监视器。 通过synchronized关键字进行synchronized和Locks是不同的概念。 另请参阅相关答案。

通过synchronized (=使用内部监视器/锁)的synchronized将锁信息直接存储在对象的内部内存表示上,并在本机代码中实现。 锁将锁信息存储在自己的 Java 对象中,并在 Java 代码中实现。 有了它,锁比内置的内在监视器更灵活。 例如,它们允许对象边界上的互斥,它们可以授予多个线程并发读取访问权限,并让开发人员在公平或不公平锁定之间进行选择。 内置同步无法实现的所有事情。

因此,虽然 ReentrantLock(如 JavaDoc 中所述)与使用synchronized方法和语句访问的隐式监视器锁具有相同的基本行为和语义,但它以完全不同的方式实现。

灵活性的获得是以复杂性为代价的。 虽然跟踪内部监视器的状态非常简单,但监视和检测甚至分析 ReentrantLock 的死锁要困难得多。 据我所知,与内置的内在锁/监视器相比,大多数监控工具(包括飞行记录器)不提供或仅提供有限的锁支持。

您将体会到内置同步机制的简单性,这是您第一次必须分析大量使用 ReentrantLocks 或其他 Lock 实现的生产代码中的死锁;-)

有为 java.util.concurrent 添加事件的增强请求,但是如果不增加开销就很难做到。

https://bugs.openjdk.java.net/browse/JDK-8067779

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM