Java 死鎖的例子

《併發的挑戰》學習標註

多線程是我覺得初入JAVA中的一個難點,之前一直知道線程有阻塞死鎖的狀態,但是很抽象,但是真的讓我自己寫一個死鎖的例子,我還真的有點下筆難的感覺,今天看到這本書的第一章,就學習到了一個簡單的線程死鎖例子,在這裏分享出來:

public class DeadLockDemo {
    private static String A = "A";
    private static String B = "B";
    public static void main(String[] args){
        new DeadLockDemo().deadLock();;
    }
    private void deadLock(){
        Thread t1=new Thread(new Runnable() {
            public void run() {
                synchronized (A) {
                    try {
                        System.out.println("A1");
                        Thread.currentThread().sleep(2000);
                    } catch (Exception e) {
                        // TODO: handle exception
                    }
                    synchronized (B) {
                           System.out.println("B1");
                    }
                }
            }
        });
        Thread t2=new Thread(new Runnable() {
            public void run() {
                synchronized (B) {
                    System.out.println("B2");
                    synchronized (A) {
                        System.out.println("A2");
                    }
                }
            }
        });
        t1.start();
        t2.start();
    }
}



運行之後可以看到輸出結果爲:

A1
B2
可以看到輸出的結果是A1,B2說明兩個線程都開始啓動了。並且都進入了一開始的synchronized方法,然後由於方法1鎖住了A,方法2鎖住了B,導致第二段代碼再去獲取對方的對象String的鎖的時候失敗,所以可以看到synchronized的作用,是鎖住傳入進來的當前對象,傳的是什麼,就鎖什麼。如果傳的是對象的.class,那麼就鎖住整個類,也是單例模式的很好的例子。


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