我遇到一些情况,在某些ReentrantReadWriteLock上阻塞了很多线程,但由于某种原因,所有者不知道。
3XMTHREADBLOCK Parked on:
java/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync@0xC3C0E5E8 Owned by: <unknown>
这是因为所有者线程已经存在吗?
为什么JVM不释放锁?
还有其他原因吗?
答案 0 :(得分:0)
此线程已停放且未被阻止。线程通过java.util.concurrent
API进入停放状态
如果提供了这样的对象,则驻留的线程将被列为停放在传递给基础java.util.concurrent.locks.LockSupport.park()
方法的阻止程序对象上。如果未提供阻止程序对象,则会将线程列为Parked on: <unknown>
如果传递给park()
方法的对象扩展了java.util.concurrent.locks.AbstractOwnableSynchronizer
类,并使用该类的方法来跟踪拥有的线程,则会显示有关拥有线程的信息。如果对象不使用AbstractOwnableSynchronizer
类,则拥有线程将列为<unknown>
有关更多详细信息,请查看IBM知识中心的Blocked thread information(这是此答案的来源)。