Java併發學習記錄—手寫一個死鎖的Demo

真實的面試場景下,當面試官問到死鎖相關的知識點的時候,往往會讓你手寫一個死鎖的案例,一般是考察面試者手寫代碼的功力。

死鎖,指兩個或多個線程之間,由於互相持有對方需要的鎖,而永久處於阻塞的狀態。

public class DeadLock implements Runnable{

    int flag=1;

    static Object o1=new Object();
    static Object o2=new Object();

    @Override
    public void run() {
        System.out.println("flag="+flag);
        if(flag==1){
            synchronized (o1){
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (o2){
                    System.out.println("線程1成功拿到兩把鎖");
                }
            }
        }
        if(flag==0){
            synchronized (o2){
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (o1){
                    System.out.println("線程2成功拿到兩把鎖");
                }
            }
        }
    }

    public static void main(String[] args) {
        DeadLock d1=new DeadLock();
        DeadLock d2=new DeadLock();
        d1.flag=1;
        d2.flag=0;
        Thread t1=new Thread(d1);
        Thread t2=new Thread(d2);
        t1.start();
        t2.start();
    }
}

 執行結果如下,並沒有打印出來線程1或2拿到鎖

flag=0
flag=1

如果想具體看一下死鎖的情況,需要直接 jstack -pid,我摘取了關鍵的信息如下:

Found one Java-level deadlock:
=============================
"Thread-1":
  waiting to lock monitor 0x000000001c8d3728 (object 0x000000076b8bd7a8, a java.lang.Object),
  which is held by "Thread-0"
"Thread-0":
  waiting to lock monitor 0x000000001c8d0c88 (object 0x000000076b8bd7b8, a java.lang.Object),
  which is held by "Thread-1"

Java stack information for the threads listed above:
===================================================
"Thread-1":
        at DeadLock.run(DeadLock.java:36)
        - waiting to lock <0x000000076b8bd7a8> (a java.lang.Object)
        - locked <0x000000076b8bd7b8> (a java.lang.Object)
        at java.lang.Thread.run(Thread.java:748)
"Thread-0":
        at DeadLock.run(DeadLock.java:24)
        - waiting to lock <0x000000076b8bd7b8> (a java.lang.Object)
        - locked <0x000000076b8bd7a8> (a java.lang.Object)
        at java.lang.Thread.run(Thread.java:748)

Found 1 deadlock.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章