很是經典的一段死鎖的代碼

1,概念:多線程

在多線程環境中,咱們常常會遇到多個線程訪問同一個共享資源的狀況,這個時候必須考慮如何維護數據一致性,常見的方式是加鎖處理。只有拿到鎖的線程才能夠訪問共享資源,經過鎖就可讓線程對共享資源的訪問都是順序的,避免出現一些數據不一致的問題。spa

在使用鎖的過程當中一樣也有風險,最爲常見的就是死鎖現象。死鎖就至關於繩子打死結同樣,解不開了。在程序中出現這樣的狀況每每是因爲多個線程同時鎖住多個資源不釋放致使的。線程

2,上代碼code

/**
 * @Auther: wangbao02
 * @Date: 2018/7/9 09:57
 * @Description:
 */
public class Deadlock {
    public static String str1 = "str1";
    public static String str2 = "str2";

    public static void main(String[] args){
        Thread a = new Thread(() -> {
            try{
                while(true){
                    synchronized(Deadlock.str1){
                        System.out.println(Thread.currentThread().getName()+"鎖住 str1");
                        Thread.sleep(1000);
                        synchronized(Deadlock.str2){
                            System.out.println(Thread.currentThread().getName()+"鎖住 str2");
                        }
                    }
                }
            }catch(Exception e){
                e.printStackTrace();
            }
        });

        Thread b = new Thread(() -> {
            try{
                while(true){
                    synchronized(Deadlock.str2){
                        System.out.println(Thread.currentThread().getName()+"鎖住 str2");
                        Thread.sleep(1000);
                        synchronized(Deadlock.str1){
                            System.out.println(Thread.currentThread().getName()+"鎖住 str1");
                        }
                    }
                }
            }catch(Exception e){
                e.printStackTrace();
            }
        });

        a.start();
        b.start();
    }
}

上面的代碼就是一個完整的死鎖程序,程序中有兩個線程,線程1鎖住了str1,得到鎖以後休眠1秒鐘,這個時候線程2鎖住了str2,也進行休眠操做。對象

線程1休眠完了以後去鎖str2,可是str2已經被線程2給鎖住了,這邊只能等待,一樣的道理,線程2休眠完以後也要去鎖str1,一樣也會等待,這樣死鎖就產生了。blog

若是咱們將下面這2行代碼的值改爲同樣,死鎖還會存在嗎?ip

 public static String str1 = "str1";
 public static String str2 = "str1";

答案是不會,爲何?
網上看到別人的回答:在聲明一個對象做爲鎖的時候要注意字符串類型鎖對象,由於字符串有一個常量池,若是不一樣的線程持有的鎖是具備相同字符的字符串鎖時,兩個鎖實際上同一個鎖。資源

相關文章
相關標籤/搜索