JVM Bug:多个线程持有一把锁?
注:文章首发于InfoQ,
http://www.infoq.com/cn/articles/jvm-bug-thread
JVM线程dump Bug描述
在JAVA语言中,当同步块(Synchronized
)被多个线程并发访问时,JVM中会采用基于互斥实现的重量级锁。JVM最多只允许一个线程持有这把锁,如果其它线程想要获得这把锁就必须处于等待状态,也就是说在同步块被并发访问时,最多只会有一个处于RUNNABLE
状态的线程持有某把锁,而另外的线程因为竞争不到这把锁而都处于BLOCKED
状态。然而有些时候我们会发现处于BLOCKED
状态的线程,它的最上面那一帧在打印其正在等待的锁对象时,居然也会出现-locked的信息,这个信息和持有该锁的线程打印出来的结果是一样的(请看下图),但是对比其他BLOCKED
态的线程却并没有都出现这种情况。当我们再次dump线程时又可能出现不一样的结果。测试表明这可能是一个偶发的情况,本文就是针对这种情况对JVM内部的实现做了一个研究以寻找其根源。