java - 记录在我的对象上获得锁定的所有线程

标签 java multithreading

我需要跟踪在我的一个对象上获得锁定的所有线程。

是否可以在任何线程获取锁时 Hook 到 java 中的隐式同步机制并记录线程 ID(或其他一些信息)?

据我所知,没有任何方法可以直接覆盖。我也没有在反射 api 中找到任何有用的东西。我没有找到任何能够跟踪锁的外部工具(VisualVM 仅跟踪 cpu 和内存使用情况,FindBugs 使用静态分析,javapathfinder 似乎只能测试小型非 awt 应用程序)。

编辑: 似乎有一个非常相似的问题In Java, how to log a message every time a given object's monitor is entered or exited?

最佳答案

看起来您最有可能在所有情况下都能正常工作的解决方案(除了要求每次使用都调用自定义锁定函数之外)是执行字节码检测。您会找到所有 monitorenter 和 monitorexit 的情况,并在这些情况下添加您自己的特殊说明。两个可以提供帮助的资源是:http://www.correlsense.com/blog/java-bytecode-instrumentation-an-introduction/ (这是一篇包含一些信息的博客文章)和 http://commons.apache.org/proper/commons-bcel/manual.html (这是一个可以帮助你的图书馆)。

关于java - 记录在我的对象上获得锁定的所有线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22197491/

相关文章:

java - 在运行时交换 Jackson 自定义序列化器/反序列化器

java - 如何使用eclipse将所有图像包含在jar文件中

multithreading - 优先级队列的现实示例是什么?

java - 用 Java 编写一个 Unix Kill 程序

java - 带有可选类的方法注入(inject)?

java - int[] 数组和 int array[] 之间的区别

c# - 防止 UI 在处理数据时卡住

multithreading - 如何在 Perl 中以线程安全的方式更改当前目录?

c# - 优化异步HttpClient请求

java - 让两个计时器工作并在应该的时候结束?