在高度并发的系统中,很难确信您对锁的使用是否正确。具体来说,如果以在另一个线程中以正确顺序获取的顺序获取锁定,则会导致死锁。
有一些工具(例如Coverity)可以对代码库进行静态分析并查找“异常”锁定命令。我想探索满足我需求的其他选择。
是否有用于检测Java代码的轻量级工具,可以检测以预期的顺序获取锁定的情况?我可以通过评论/注释显式调用锁定命令。
首选免费和/或开源解决方案。如果有针对此问题的非仪器方法,请评论。
*就我的目的而言,轻量级意味着......
synchronize
语句中混乱我的代码。如前所述,我可以明确地评论/注释被相对排序锁定的对象或对象类。答案 0 :(得分:3)
我没有使用过AspectJ,所以无法保证它的易用性。我使用ASM创建了一个自定义代码分析器,这大约是2天的工作。仪器同步的努力应该是类似的。一旦你熟悉方面,AspectJ应该更快更容易。
我已经为基于c ++的服务器实现了死锁检测跟踪。我是这样做的:
<time> <tid> <lockid> <acquiring|releasing> <location in code>
Lock A -> Lock B -> Lock C
列表,生成对(Lock A, Lock B), (Lock A, Lock C), (Lock B, Lock C)
我在未能找到死机原因数天之后做到这一点,需要花费几天时间才能实现,并且需要几个小时才能找到死锁。
如果您在Java中考虑这种方法,需要考虑的事项是:
synchronized
来保护您的关键部分?你在java.lang.concurrent中使用这些类吗? (这些可能需要特殊处理/仪器)__FILE__
和__LINE__
。 ASM将为您提供类名,方法名和签名。答案 1 :(得分:1)
您可以使用AspectJ,它相对容易学习,并允许您设置自己的自定义和简化方式来监控线程及其访问的任何锁。
答案 2 :(得分:0)
不能让你一路走好,但一个好的开始就是使用JCIP annotations和FindBugs抓住一些东西。