上面显示了jstack的部分输出。可以看到,哲学家A和哲学家B两个线程发生了死锁。并且在最后,可以看到两者相互等待的锁的ID。同时,死锁的两个线程均处于BLOCK状态。
如果想避免死锁,除了使用无锁的函数外,另外一种有效的做法是使用第三章节介绍的重入锁,通过重入锁的中断或者限时等待可以有效规避死锁带来的问题。大家可以再回顾一下相关内容。
4.6 参考文献
有关偏向锁、轻量级锁、自旋锁等虚拟机中的锁优化
有关强引用、软引用、弱引用的概念
有关Bootstrap ClassLoader
《实战Java虚拟机——JVM故障诊断与性能优化》
有关Hibernate中ThreadLocal的使用
http://blog.sina.com.cn/s/blog_7ffb8dd5010146i3.html
有关CAS的指令集,可以参考
http://web.itu.edu.tr/kesgin/mul06/intel/instr/cmpxchg.html
有关Unsafe的使用
http://www.uucode.net/201407/java-unsafe
java.util.Vector的空间扩展
http://www.uucode.net/201504/vector-size-alloc
有关哲学家就餐问题
http://zh.wikipedia.org/wiki/哲学家就餐问题