jstack发现死锁,求问一下这种死锁可能的原理?
Found one Java-level deadlock:
=============================
"pool-168-thread-1":
waiting for ownable synchronizer 0x0000000798eb5dc0, (a java.util.concurrent.locks.ReentrantLock$NonfairSync),
which is held by "pool-1-thread-4"
"pool-1-thread-4":
waiting for ownable synchronizer 0x0000000798f5a9a0, (a java.util.concurrent.locks.ReentrantLock$NonfairSync),
which is held by "pool-1-thread-8"
"pool-1-thread-8":
waiting for ownable synchronizer 0x0000000798eb5dc0, (a java.util.concurrent.locks.ReentrantLock$NonfairSync),
which is held by "pool-1-thread-4"
Java stack information for the threads listed above:
===================================================
"pool-168-thread-1":
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x0000000798eb5dc0> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
at java.util.concurrent.locks.LockSupport.park(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(Unknown Source)
at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(Unknown Source)
at java.util.concurrent.locks.ReentrantLock.lock(Unknown Source)
...
at java.lang.Thread.run(Unknown Source)
"pool-1-thread-4":
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x0000000798f5a9a0> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
at java.util.concurrent.locks.LockSupport.park(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(Unknown Source)
at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(Unknown Source)
at java.util.concurrent.locks.ReentrantLock.lock(Unknown Source)
...
at java.lang.Thread.run(Unknown Source)
"pool-1-thread-8":
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x0000000798eb5dc0> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
at java.util.concurrent.locks.LockSupport.park(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(Unknown Source)
at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(Unknown Source)
at java.util.concurrent.locks.ReentrantLock.lock(Unknown Source)
...
at java.lang.Thread.run(Unknown Source)
Found 1 deadlock.
隐去了部分业务代码的栈信息,用... 代替了
没有看到held的情况,都是parking to wait for .. 被定位了deadlock,而且是三个线程,是退出时机的问题吗?
不是太理解,求大佬指教