多線程的死鎖

Java線程死鎖是一個經典的多線程問題,不一樣線程在等待根本不可能釋放的鎖,從而致使任務沒法完成。java

示例:

DealThread.javabash

package com.synchronsized;

public class DealThread implements Runnable {
    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");
                }
            }

        }
    }
}

Run2_1.java多線程

package com.synchronsized;

public class Run2_1 {
    public static void main(String[] args) {
        try {
            DealThread t1 = new DealThread();
            t1.setFlag("a");
            Thread thread1 = new Thread(t1);
            thread1.start();
            Thread.sleep(100);
            t1.setFlag("b");
            Thread thread2 = new Thread(t1);
            thread2.start();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

輸出結果:ide

username = a
username = b工具

相信你們都猜到了,兩個線程都只輸出了一句username=   ,由於都在互相等待對方的鎖釋放,因此造成了死鎖。this

如何查看死鎖?

能夠使用JDK自帶的工具來檢測是否有死鎖。spa

打開CMD工具,進入jdk的bin目錄線程

執行jps命令code

D:\JDK\bin>jps
6560 Jps
1348
6740 Launcher
8956 Run2_1

獲得線程Run2_1 的id是8956orm

執行 jstack查看結果 :

jstack -l 8956
Found one Java-level deadlock:
=============================
"Thread-1":
  waiting to lock monitor 0x00000000028ce258 (object 0x00000000d6080e48, a java.lang.Object),
  which is held by "Thread-0"
"Thread-0":
  waiting to lock monitor 0x00000000028cb868 (object 0x00000000d6080e58, a java.lang.Object),
  which is held by "Thread-1"

Java stack information for the threads listed above:
===================================================
"Thread-1":
        at com.synchronsized.DealThread.run(DealThread.java:37)
        - waiting to lock <0x00000000d6080e48> (a java.lang.Object)
        - locked <0x00000000d6080e58> (a java.lang.Object)
        at java.lang.Thread.run(Thread.java:748)
"Thread-0":
        at com.synchronsized.DealThread.run(DealThread.java:23)
        - waiting to lock <0x00000000d6080e58> (a java.lang.Object)
        - locked <0x00000000d6080e48> (a java.lang.Object)
        at java.lang.Thread.run(Thread.java:748)

Found 1 deadlock.
相關文章
相關標籤/搜索