`
snowm
  • 浏览: 1186 次
  • 来自: ...
最近访客 更多访客>>
社区版块
存档分类
最新评论

jstack使用

    博客分类:
  • JVM
 
阅读更多

都知道jstack是干嘛的

本文讲如何看它的输出内容:

1. synchronized

已经进入临界区,sleep,在边界等待

 

 
    @Test
    public void testSync() {
        final String s = "test";
        Runnable task = new Runnable() {

            public void run() {
                synchronized (s) {
                    try {
                        Thread.sleep(60 * 1000);
                    } catch (InterruptedException e) {
                        //这里直接抓住就不要深究了
                        e.printStackTrace();
                    }
                }
            }
        };
        Thread t = new Thread(task, "test-thread");
        t.start();

        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        synchronized (s) {
            System.out.println("end....");
        }
    }

这个用例简单说就是,先起一个线程“test-thread",取得对象s上的锁,然后sleep 1min。 

然后主线程尝试获取s上的锁,当然就会被阻塞住了(1min),通过jstack取得信息如下:

 

"test-thread" prio=6 tid=0x000000000749e800 nid=0x10f4 waiting on condition [0x000000000787f000]
   java.lang.Thread.State: TIMED_WAITING (sleeping) //处于TIMED_WAITING状态,等待某个条件
        at java.lang.Thread.sleep(Native Method)
        at com.snowm.test.concurrent.TestInnerImplements$1.run(TestInnerImplements.java:17)
        - locked <0x000000077f454e80> (a java.lang.String) //已经对一个String对象加锁(已进入临界区)
        at java.lang.Thread.run(Thread.java:662)
 
   Locked ownable synchronizers:
        - None 
 
"main" prio=6 tid=0x000000000027c000 nid=0x188c waiting for monitor entry [0x000000000260e000]
   java.lang.Thread.State: BLOCKED (on object monitor) //处于BLOCKED状态,是synchronized干的
        at com.snowm.test.concurrent.TestInnerImplements.testSync(TestInnerImplements.java:34)
        - waiting to lock <0x000000077f454e80> (a java.lang.String) //在等待对一个String对象加锁(还在边界)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
 
   Locked ownable synchronizers:
        - None
 

 

 

重入,以及wait()

 

    @Test
    public void testSyncReentryWait() {
        final String s = "test";
        synchronized (s) {
            synchronized (s) {
                try {
                    s.wait();
                } catch (InterruptedException e) {
                    // 这里直接抓住就不要深究了
                    e.printStackTrace();
                }
            }
        }
    }

 

"main" prio=6 tid=0x000000000018c000 nid=0x2624 in Object.wait() [0x00000000024de000]
   java.lang.Thread.State: WAITING (on object monitor)//处于WAITING状态,是Object.wait()干的
        at java.lang.Object.wait(Native Method)
        - waiting on <0x000000077f455268> (a java.lang.String)//在等一个String对象的信号
        at java.lang.Object.wait(Object.java:485)
        at com.snowm.test.concurrent.TestInnerImplements.testSyncReentryWait(TestInnerImplements.java:44)
        - locked <0x000000077f455268> (a java.lang.String)//又对这个String对象加锁(地址一样)
        - locked <0x000000077f455268> (a java.lang.String)//已经对一个String对象加锁
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 
   Locked ownable synchronizers:
 
        - None
 

 

 wait(time)

    @Test
    public void testSyncWaittime() {
        final String s = "test";
        synchronized (s) {
            try {
                s.wait(60 * 1000);
            } catch (InterruptedException e) {
                // 这里直接抓住就不要深究了
                e.printStackTrace();
            }
        }
    }

 

"main" prio=6 tid=0x000000000051c000 nid=0x148c in Object.wait() [0x00000000026ae000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x000000077f456018> (a java.lang.String)
        at com.snowm.test.concurrent.TestInnerImplements.testSyncWaittime(TestInnerImplements.java:62)
        - locked <0x000000077f456018> (a java.lang.String)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

   Locked ownable synchronizers:
        - None

 

 

 

2. ReentrantLock

已经进入临界区,在边界等待 

    @Test
    public void testReentrantLock() {
        final ReentrantLock lock = new ReentrantLock();
        Runnable task = new Runnable() {

            public void run() {
                lock.lock();
                try {
                    Thread.sleep(60*1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    lock.unlock();
                }
            }
        };
        Thread t = new Thread(task, "test-thread");
        t.start();

        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        lock.lock();
        try {
            System.out.println("end....");
        } finally {
            lock.unlock();
        }
    }

 

"test-thread" prio=6 tid=0x00000000075df800 nid=0x25c8 waiting on condition [0x00000000080ff000]

   java.lang.Thread.State: TIMED_WAITING (sleeping)//sleep

        at java.lang.Thread.sleep(Native Method)

        at com.snowm.test.concurrent.TestInnerImplements$2.run(TestInnerImplements.java:63)

        at java.lang.Thread.run(Thread.java:662)

 

   Locked ownable synchronizers:

        - <0x00000007d6e1b420> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)//锁住当前线程的同步器拥有者

 

"main" prio=6 tid=0x000000000053c000 nid=0x2274 waiting on condition [0x000000000264e000]

   java.lang.Thread.State: WAITING (parking)//WAITING,unsafe.park()干的

        at sun.misc.Unsafe.park(Native Method)

        - parking to wait for  <0x00000007d6e1b420> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)//parking在等待某个同步器(就是test-thread上那个锁同步器)

        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$NonfairSync.lock(ReentrantLock.java:186)

        at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:262)

        at com.snowm.test.concurrent.TestInnerImplements.testReentrantLock(TestInnerImplements.java:81)

        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

 

   Locked ownable synchronizers:

        - None 

 

 

 

重入

 

 

    @Test
    public void testReentrantLockReentry() {
        final ReentrantLock lock = new ReentrantLock();
        lock.lock();
        lock.lock();
        try {
            Thread.sleep(60 * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
            lock.unlock();
        }
    }
 
"main" prio=6 tid=0x000000000022c000 nid=0x1728 waiting on condition [0x00000000025de000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at com.snowm.test.concurrent.TestInnerImplements.testReentrantLockReentry(TestInnerImplements.java:93)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)

   Locked ownable synchronizers:
        - <0x00000007d6e1dc10> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)//锁住当前线程的同步器拥有者
 

 

await()
    @Test
    public void testReentrantLockAwait() {
        final ReentrantLock lock = new ReentrantLock();
        final Condition condition = lock.newCondition();
        lock.lock();
        try {
            condition.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
 
"main" prio=6 tid=0x00000000005bc000 nid=0x10f4 waiting on condition [0x000000000250e000]
   java.lang.Thread.State: WAITING (parking)//WAITING,Unsafe.park()干的
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000007d6e1f108> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)//parking在等待一个条件对象的信号
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987)
        at com.snowm.test.concurrent.TestInnerImplements.testReentrantLockAwait(TestInnerImplements.java:132)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

   Locked ownable synchronizers:
        - None
 
await(time, timeUnit)
    @Test
    public void testReentrantLockAwaitTime() {
        final ReentrantLock lock = new ReentrantLock();
        final Condition condition = lock.newCondition();
        lock.lock();
        try {
            condition.await(60, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
 
"main" prio=6 tid=0x000000000036c000 nid=0x148c waiting on condition [0x00000000025be000]
   java.lang.Thread.State: TIMED_WAITING (parking)//WAITING, Unsafe.park()干的
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000007d6e20798> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)//parking在等待一个条件对象的信号
        at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:196)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2116)
        at com.snowm.test.concurrent.TestInnerImplements.testReentrantLockAwaitTime(TestInnerImplements.java:146)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

   Locked ownable synchronizers:
        - None

 
3. LockSupport.park
没有blocker
    @Test
    public void testPark() {
        LockSupport.park();
    }
 
"main" prio=6 tid=0x000000000055c000 nid=0x30c8 waiting on condition [0x000000000258e000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:283)
        at com.snowm.test.concurrent.TestInnerImplements.testPark(TestInnerImplements.java:171)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

   Locked ownable synchronizers:
        - None
 
有blocker
    @Test
    public void testParkWithBlocker() {
        LockSupport.park(this);
    }
 
"main" prio=6 tid=0x000000000026c000 nid=0x2674 waiting on condition [0x000000000256e000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000007d6e1d2e0> (a com.snowm.test.concurrent.TestInnerImplements)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
        at com.snowm.test.concurrent.TestInnerImplements.testParkWithBlocker(TestInnerImplements.java:176)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

   Locked ownable synchronizers:
        - None
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics