如何检测死锁?同步块超时?

Dan*_*cco 14 java multithreading deadlock

我正在调试运行多个线程的Java应用程序.经过一段时间观察日志后,似乎其中一个线程不再运行了.我的猜测是线程正在等待一个永不释放的锁(最后一个输出是在调用synchronized方法之前).

我可以为线程配置超时; 一种"等待这种锁定,但如果在10秒后不可用,就不要再等了!"

Ben*_*ngs 27

您可以使用java.util.concurrent.Lock而不是内部Object锁.没有公平排序的RentrantLock具有与内在锁相同的基本行为和语义.有一个方法tryLock采用超时参数:

Lock lock = ...;
if (lock.tryLock(10L, TimeUnit.SECONDS)) {
    try {
        // manipulate protected state
    } finally {
        lock.unlock();
    }
} else {
      // perform alternative actions
}
Run Code Online (Sandbox Code Playgroud)


Ric*_*ich 10

您可以使用调试工具或分析器,而不是添加额外的代码进行调试.

一种选择是使用类似JConsole(随JDK一起提供)的东西,其中包括一个名为"Detect Deadlock"的按钮(至少它在Java 6中有用,我认为它不适用于Java 5).另一个选择是生成一个线程转储到控制台 - 在Unix上,您可以键入"kill -3",而在Windows上CTRL + BRK将起作用.其他分析工具(如VisualVM(也在JDK中))可以提供帮助.最后是JCarder,它是"用于在并发多线程Java程序中查找潜在死锁的开源工具".