1,概念:
在多線程環境中,我們經常會遇到多個線程訪問同一個共享資源的情況,這個時候必須考慮如何維護數據一致性,常見的方式是加鎖處理。只有拿到鎖的線程才可以訪問共享資源,通過鎖就可以讓線程對共享資源的訪問都是順序的,避免出現一些數據不一致的問題。
在使用鎖的過程中同樣也有風險,最為常見的就是死鎖現象。死鎖就相當於繩子打死結一樣,解不開了。在程序中出現這樣的情況往往是由於多個線程同時鎖住多個資源不釋放導致的。
2,上代碼
/** * @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,同樣也會等待,這樣死鎖就產生了。

如果我們將下面這2行代碼的值改成一樣,死鎖還會存在嗎?
public static String str1 = "str1"; public static String str2 = "str1";
答案是不會,為什么?
網上看到別人的回答:在聲明一個對象作為鎖的時候要注意字符串類型鎖對象,因為字符串有一個常量池,如果不同的線程持有的鎖是具有相同字符的字符串鎖時,兩個鎖實際上同一個鎖。

