【Java 多線程併發】Java 鎖(中)—— Synchronized 同步鎖、ReentrantLock、Semaphonre 信號量、AtomicInteger

上一篇:【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 實現

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