我有一种情况,许多线程在某些 ReentrantReadWriteLock 上被阻塞,但由于某种原因,所有者不知道。
3XMTHREADBLOCK Parked on:
java/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync@0xC3C0E5E8 Owned by: <unknown>
这是因为所有者线程已经存在吗?
为什么JVM不释放锁?
还能有其他原因吗?
此线程已停放且未阻塞。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(这是此答案的来源)。