Java thread dump: Difference between “waiting to lock” and “parking to wait for”?

前端 未结 2 674
小蘑菇
小蘑菇 2021-01-30 05:23

In a Java thread dump, you can see locks mentioned within stack traces.
There seems to be three kinds of information:

1:

- locked <0x00002aab329f7         


        
2条回答
  •  渐次进展
    2021-01-30 05:38

    You will get "waiting to lock" in the thread dump when using intrinsic locks and "parking to wait for" when using locks from java.util.concurrent. Consider the following example:

    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    public class LockTest {
    
        final Lock lock = new ReentrantLock(true);
    
        synchronized void intrinsicLock() {
            Thread th = new Thread(new Runnable() {
                public void run() {
                    intrinsicLock();
                }
            }, "My thread");
            th.start();
            try {
                th.join();
            } catch (InterruptedException e) {
            }
        }
    
        void reentrantLock() {
            lock.lock();
            Thread th = new Thread(new Runnable() {
                public void run() {
                    reentrantLock();
                }
            }, "My thread");
            th.start();
            try {
                th.join();
            } catch (InterruptedException e) {
            }
            lock.unlock();
        }
    
    
        public static void main(String[] args) {
            LockTest lockTest = new LockTest();
            lockTest.intrinsicLock();
            //lockTest.reentrantLock();
        }
    
    }
    

    With lockTest.intrinsicLock() you will get the following thread dump:

    "My thread" prio=10 tid=0x00007fffec015800 nid=0x1775 waiting for monitor entry [0x00007ffff15e5000]
       java.lang.Thread.State: BLOCKED (on object monitor)
        at LockTest.intrinsicLock(LockTest.java:9)
        - waiting to lock <0x00000007d6a33b10> (a LockTest)
        at LockTest$1.run(LockTest.java:11)
        at java.lang.Thread.run(Thread.java:662)
    

    while lockTest.reentrantLock() produce:

    "My thread" prio=10 tid=0x00007fffec082800 nid=0x17e8 waiting on condition [0x00007ffff14eb000]
       java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000007d6a33d30> (a java.util.concurrent.locks.ReentrantLock$FairSync)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:811)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:842)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1178)
        at java.util.concurrent.locks.ReentrantLock$FairSync.lock(ReentrantLock.java:201)
        at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:262)
        at LockTest.reentrantLock(LockTest.java:22)
        at LockTest$2.run(LockTest.java:25)
        at java.lang.Thread.run(Thread.java:662)
    

提交回复
热议问题