use*_*247 3 java multithreading deadlock
我在Java中有旧的代码死锁...我从未使用netbeans作为开发工具......但是,我需要修复代码.
我在调试模式下运行应用程序,单击检查死锁并且netBeans带来了一个屏幕.四个线程中有两个是红色的...请参阅下面的屏幕转储.
我是多线程的新手,并且代码顶部不是我的......
什么最有可能导致问题?

小智 5
据我所知,问题很可能与多线程获取和释放锁的方式(或更具体地说,顺序)有关.在上面的示例中,两个线程需要访问两个锁(或监视器):
从当前处于死锁的两个线程的堆栈跟踪中,我们可以看到线程'ExecutionManager'已经获得了ExecutionManager监视器,但正在等待'ESMarketMaker'监视器的获取(同时仍然持有'ExecutionManager'监视器).
另一方面,'StrategyManager'线程已经获得了'ESMarketMaker'监视器,但正在等待'ExecutionManager'监视器的采集(同时仍然持有'ESMarketMaker'监视器).
这是死锁的一个类示例,以及锁的获取顺序可能导致死锁的多种方式.
有很多方法可以解决这些问题:
有一点需要注意的是,有时在决定使用协议时,您需要更加明确地控制锁,而不是Java中的正常同步.在这些情况下,显式ReentrantLock实例的使用可能是一个好处,因为这些允许您执行诸如检查锁是解锁还是当前锁定之类的操作,并执行如上所述的非阻塞尝试锁.
我希望这有帮助,对不起,我不能更具体,但我需要看到源代码.:-)
(哦,ps,第三件事可能会选择,如果死锁是必须通过所有成本避免的事情,是调查建模工具,在程序状态和锁定模型状态机,可以使用与分析工具一起使用,可以检查此类模型中是否存在可能的死锁,如果找到任何此类模型,则会给出示例).
| 归档时间: |
|
| 查看次数: |
1402 次 |
| 最近记录: |