上一篇:【Java 多線程併發】Java 鎖(上)—— 樂觀鎖、悲觀鎖、自旋鎖
4.Synchronized 同步鎖
synchronized 它可以把任意一個非 NULL 的對象當作鎖。
他屬於獨佔式的悲觀鎖,同時屬於可重入鎖。
Synchronized 作用範圍
1.作用於方法時,鎖住的是對象的實例(this);
2.當作用於靜態方法時,鎖住的是 Class 實例,又因爲 Class 的相關數據存儲在永久代 PermGen(jdk1.8 則是 metaspace),永久代是全局共享的,因此靜態方法鎖相當於類的一個全局鎖,會鎖所有調用該方法的線程;
3.synchronized 作用於一個對象實例時,鎖住的是所有以該對象爲鎖的代碼塊。它有多個隊列,當多個線程一起訪問某個對象監視器的時候,對象監視器會將這些線程存儲在不同的容器中。
Synchronized 核心組件
1)Wait Set:哪些調用 wait 方法被阻塞的線程被放置在這裏;
2)Contention List:競爭隊列,所有請求鎖的線程首先被放在這個競爭隊列中;
3)Entry List:Contention List 中那些有資格成爲候選資源的線程被移動到 Entry List 中;
4)OnDeck:任意時刻,最多隻有一個線程正在競爭鎖資源,該線程被稱爲 OnDeck;
5)Owner:當前已經獲取到鎖資源的線程被稱爲 Owner;
5)!Owner:當前釋放鎖的線程。
Synchronized 實現