我需要跟踪在我的一个对象上获得锁定的所有线程。
是否可以在任何线程获取锁时 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/