TimerThread 是不是导致死锁发生?

Posted

技术标签:

【中文标题】TimerThread 是不是导致死锁发生?【英文标题】:Is the TimerThread cause DeadLock happend?TimerThread 是否导致死锁发生? 【发布时间】:2019-02-23 15:42:08 【问题描述】:

Timer-2 线程在 0x00000000e1a23398 上等待,它也在锁定 0x00000000e1a23398。这种情况会导致 Timer-2 线程死锁吗? 谁能帮我解释一下?

【问题讨论】:

【参考方案1】:

这不是死锁的证据。

Timer-2 已获得TaskQueue 对象的锁定,并正在等待同一对象的通知。事实上,如果线程在调用Object.wait() 时没有持有锁,它会得到IllegalMonitorStateException

我并不是说您的应用程序根本没有陷入僵局。但是,两个线程“Timer-1”和“Timer2-”都在等待其他线程通知它们。这不是典型的死锁,两个线程都在等待对方释放锁。


我还能弄清楚什么?

嗯,从java.util.Timer的代码来看:

“Timer-2”线程只是在等待定时器的下一次触发。对于Timer,这是完全正常的行为。

“Timer-1”线程正在执行定时器任务。它似乎正在尝试创建与(可能)远程服务的 NSQ 连接。如果它被阻塞,那可能意味着它尝试连接的服务由于某种原因无法访问。

如果不深入研究“com.trendrr.nsq”源代码,就无法从堆栈转储中收集到更多信息。


有没有什么思路可以用来查找原因?

    查看日志文件。 检查配置(或其他)以确定它尝试连接的服务的主机/端口。 检查服务是否正在运行 检查是否可以从客户端访问 深入了解源代码 调试、挠头等等。 作为最后的手段,聘请顾问。

【讨论】:

是啊,不是典型的死锁,有什么思路可以用来查找原因吗?

以上是关于TimerThread 是不是导致死锁发生?的主要内容,如果未能解决你的问题,请参考以下文章

mysql 发生死锁问题请求帮助

AUParameterTree 释放导致死锁

发生死锁的条件

有人可以解释管道缓冲区死锁吗?

死锁(操作系统)

两个INSERT发生死锁原因剖析