很久以前,我从Java参考书中保存了一句话:"Java没有处理死锁的机制.它甚至不知道发生了死锁." (Head First Java 2nd Edition,p.516)
那么,它是什么呢?有没有办法在Java中捕获死锁案例?我的意思是,有没有一种方法可以让我们的代码了解发生死锁的情况?
我有一个多线程的应用程序.有几条消息即将发送到应用程序,并在分离的线程中处理.为此,我使用包java.util.concurrent中的类ThreadPoolExecutor和FutureTask.
偶尔我在应用程序中有一些死锁.当发生死锁时我想中断阻塞线程,我想记录这个线程的堆栈跟踪,以便以后可以解决死锁.
有什么方法可以在Java中找到该线程之外的线程的堆栈跟踪?
我们的一个应用程序刚刚遇到了一些令人讨厌的死锁.我很难重新创建问题,因为死锁(或堆栈跟踪)没有立即出现在我的java应用程序日志中.
令我惊讶的是,marklogic java api重试失败的请求(例如,由于死锁).如果您的请求不是多语句请求,这可能是有意义的,否则我不确定它是否确实如此.
因此,请坚持这个死锁问题.我创建了一个简单的代码片段,其中我故意创建了一个死锁.该片段创建一个文档test.xml,然后尝试从两个不同的事务中读取和写入,每个事务都在一个新线程上.
public static void main(String[] args) throws Exception {
final Logger root = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
final Logger ok = (Logger) LoggerFactory.getLogger(OkHttpServices.class);
root.setLevel(Level.ALL);
ok.setLevel(Level.ALL);
final DatabaseClient client = DatabaseClientFactory.newClient("localhost", 8000, new DatabaseClientFactory.DigestAuthContext("username", "password"));
final StringHandle handle = new StringHandle("<doc><name>Test</name></doc>")
.withFormat(Format.XML);
client.newTextDocumentManager().write("test.xml", handle);
root.info("t1: opening");
final Transaction t1 = client.openTransaction();
root.info("t1: reading");
client.newXMLDocumentManager()
.read("test.xml", new StringHandle(), t1);
root.info("t2: opening");
final Transaction t2 = client.openTransaction();
root.info("t2: reading");
client.newXMLDocumentManager()
.read("test.xml", new StringHandle(), t2);
new Thread(() -> …Run Code Online (Sandbox Code Playgroud) 多线程应用程序冻结.也许是因为僵局造成的.如果是,那么我们如何找到死锁的原因?系统地执行此操作的任何工具和策略?