随手列举几个问题。
1. 什么是死锁(一部分人认为是锁等待了)
2. 形成死锁的条件(不止一个线程,不止一个资源。一部分人只提到一个资源)
3. 如何避免死锁(从死锁形成的条件出发)
4. 死锁检测(借助一些工具,如jconsole, 或是看thread dump)
5. 出现死锁如何处理(找出问题,修复吧)
以下是用Java编写的一个死锁场景的thread dump片段。从里面可以看出,线程0占着一个资源了,还想去拿线程1占有的一个资源,而线程1却也在等着线程0释放它占着的资源。你拿着不放,想要我放;我也拿着不放,想要你放。好吧,那就干等了。
Found one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 0x00000266ff560a38 (object 0x00000007799301a0, a java.lang.Object),
which is held by "Thread-0"
"Thread-0":
waiting to lock monitor 0x00000266ff55ed58 (object 0x0000000779930178, a java.lang.Object),
which is held by "Thread-1"
Java stack information for the threads listed above:
===================================================
"Thread-1":
at Thead1.run(Thead1.java:24)
- waiting to lock <0x00000007799301a0> (a java.lang.Object)
- locked <0x0000000779930178> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:750)
"Thread-0":
at Thead1.run(Thead1.java:24)
- waiting to lock <0x0000000779930178> (a java.lang.Object)
- locked <0x00000007799301a0> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:750)
Found 1 deadlock.
以下是Jconsole的截图。