是TimerThread引起DeadLock发生了吗?

时间:2018-09-19 12:50:45

标签: java netty deadlock nsq

enter image description here

Timer-2线程正在等待0x00000000e1a23398,并且它也锁定了0x00000000e1a23398。这种情况会导致Timer-2线程死锁吗? 有人可以帮我解释一下吗?

1 个答案:

答案 0 :(得分:2)

这不是僵局的证据。

定时器2已获得对TaskQueue对象的锁定,并正在等待有关同一对象的通知。确实,如果线程未在其称为Object.wait()的点上持有锁,那么它将获得IllegalMonitorStateException

我并不是说您的应用程序完全没有死锁。但是,两个线程“ Timer-1”和“ Timer2-”都在等待其他线程通知它们。这不是经典的死锁,在死锁中,两个线程将各自等待对方释放一个锁。


我还能找到什么?

好吧,通过查看java.util.Timer的代码:

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

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

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


  

有什么想法可以用来找到原因吗?

  1. 查看日志文件。
  2. 检查配置(或其他配置)以找出它要连接到的服务的主机/端口。
  3. 检查服务是否正在运行
  4. 检查是否可以从客户端访问
  5. 深入研究源代码
  6. 调试,挠头等。
  7. 万不得已时,请聘请顾问。