2.2.12多线程的死锁(jps命令、jstack命令)

来源:互联网 发布:怎么看电脑端口号 编辑:程序博客网 时间:2024/06/06 16:36

package cha02.execise28;/** * Created by sunyifeng on 17/10/1. */public class DealThread extends Thread {    public String username;    public Object lock1 = new Object();    public Object lock2 = new Object();    public void setFlag(String username) {        this.username = username;    }    @Override    public void run() {        if (username.equals("a")) {            //            synchronized (lock1) {                try {                    System.out.println("username=" + username);                    Thread.sleep(3000);                } catch (InterruptedException e) {                    e.printStackTrace();                }                //                synchronized (lock2) {                    System.out.println("按照lock1->lock2的顺序执行");                }            }        }        //        if (username.equals("b")) {            //            synchronized (lock2) {                try {                    System.out.println("username=" + username);                    Thread.sleep(3000);                } catch (InterruptedException e) {                    e.printStackTrace();                }                //                synchronized (lock1) {                    System.out.println("按照lock2->lock1的顺序执行");                }            }        }    }}
package cha02.execise28;/** * Created by sunyifeng on 17/10/1. */public class Run {    public static void main(String[] args) {        try {            DealThread dealThread = new DealThread();            dealThread.setFlag("a");            // 线程1            Thread thread1 = new Thread(dealThread);            thread1.start();            Thread.sleep(100);            dealThread.setFlag("b");            // 线程2            Thread thread2 = new Thread(dealThread);            thread2.start();        } catch (InterruptedException e) {            e.printStackTrace();        }    }}
运行结果:

username=a
username=b

程序分析:出现死锁。进入JDK的bin目录,先后执行jps命令、jstack命令,查看结果。

MacBook-Pro:multi-thread sunyifeng$ jps
22599 Jps
22587 Launcher
22588 AppMain
MacBook-Pro:multi-thread sunyifeng$ jstack 22588
2017-10-12 23:30:52
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.101-b13 mixed mode):


"Attach Listener" #14 daemon prio=9 os_prio=31 tid=0x00007fa1f201b000 nid=0x360b waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE


"DestroyJavaVM" #13 prio=5 os_prio=31 tid=0x00007fa1f207a000 nid=0x1703 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE


"Thread-2" #12 prio=5 os_prio=31 tid=0x00007fa1f10c7800 nid=0x5103 waiting for monitor entry [0x000070000134f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at cha02.execise28.DealThread.run(DealThread.java:45)
        - waiting to lock <0x00000007956ebe98> (a java.lang.Object)
        - locked <0x00000007956ebea8> (a java.lang.Object)
        at java.lang.Thread.run(Thread.java:745)


"Thread-1" #11 prio=5 os_prio=31 tid=0x00007fa1f181f000 nid=0x4f03 waiting for monitor entry [0x000070000124c000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at cha02.execise28.DealThread.run(DealThread.java:29)
        - waiting to lock <0x00000007956ebea8> (a java.lang.Object)
        - locked <0x00000007956ebe98> (a java.lang.Object)
        at java.lang.Thread.run(Thread.java:745)


"Monitor Ctrl-Break" #9 daemon prio=5 os_prio=31 tid=0x00007fa1f2079800 nid=0x4d03 runnable [0x0000700001149000]
   java.lang.Thread.State: RUNNABLE
        at java.net.PlainSocketImpl.socketAccept(Native Method)
        at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:409)
        at java.net.ServerSocket.implAccept(ServerSocket.java:545)
        at java.net.ServerSocket.accept(ServerSocket.java:513)
        at com.intellij.rt.execution.application.AppMain$1.run(AppMain.java:79)
        at java.lang.Thread.run(Thread.java:745)


"Service Thread" #8 daemon prio=9 os_prio=31 tid=0x00007fa1f2005000 nid=0x4903 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE


"C1 CompilerThread2" #7 daemon prio=9 os_prio=31 tid=0x00007fa1f2823800 nid=0x4703 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE


"C2 CompilerThread1" #6 daemon prio=9 os_prio=31 tid=0x00007fa1f2822800 nid=0x4503 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE


"C2 CompilerThread0" #5 daemon prio=9 os_prio=31 tid=0x00007fa1f104e000 nid=0x4303 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE


"Signal Dispatcher" #4 daemon prio=9 os_prio=31 tid=0x00007fa1f2801000 nid=0x320f runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE


"Finalizer" #3 daemon prio=8 os_prio=31 tid=0x00007fa1f1048800 nid=0x3003 in Object.wait() [0x000070000092e000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x0000000795588ee0> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
        - locked <0x0000000795588ee0> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)


"Reference Handler" #2 daemon prio=10 os_prio=31 tid=0x00007fa1f2016000 nid=0x2e03 in Object.wait() [0x000070000082b000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x0000000795586b50> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:502)
        at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
        - locked <0x0000000795586b50> (a java.lang.ref.Reference$Lock)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)


"VM Thread" os_prio=31 tid=0x00007fa1f1046000 nid=0x2c03 runnable 


"GC task thread#0 (ParallelGC)" os_prio=31 tid=0x00007fa1f1004000 nid=0x2403 runnable 


"GC task thread#1 (ParallelGC)" os_prio=31 tid=0x00007fa1f200b800 nid=0x2603 runnable 


"GC task thread#2 (ParallelGC)" os_prio=31 tid=0x00007fa1f200c000 nid=0x2803 runnable 


"GC task thread#3 (ParallelGC)" os_prio=31 tid=0x00007fa1f200c800 nid=0x2a03 runnable 


"VM Periodic Task Thread" os_prio=31 tid=0x00007fa1f181e000 nid=0x4b03 waiting on condition 


JNI global references: 21




Found one Java-level deadlock:
=============================
"Thread-2":
  waiting to lock monitor 0x00007fa1f181bca8 (object 0x00000007956ebe98, a java.lang.Object),
  which is held by "Thread-1"
"Thread-1":
  waiting to lock monitor 0x00007fa1f1819418 (object 0x00000007956ebea8, a java.lang.Object),
  which is held by "Thread-2"


Java stack information for the threads listed above:
===================================================
"Thread-2":
        at cha02.execise28.DealThread.run(DealThread.java:45)
        - waiting to lock <0x00000007956ebe98> (a java.lang.Object)
        - locked <0x00000007956ebea8> (a java.lang.Object)
        at java.lang.Thread.run(Thread.java:745)
"Thread-1":
        at cha02.execise28.DealThread.run(DealThread.java:29)
        - waiting to lock <0x00000007956ebea8> (a java.lang.Object)
        - locked <0x00000007956ebe98> (a java.lang.Object)
        at java.lang.Thread.run(Thread.java:745)


Found 1 deadlock.





阅读全文
0 0