10-Synchronized:悲觀鎖,可重入鎖
阿新 • • 發佈:2018-12-05
- Synchronized:悲觀鎖,可重入鎖
- 特點:可重入的鎖
可重入鎖,一個獲得的鎖的執行緒沒執行完可以繼續獲得該鎖。
執行緒佔用鎖的時候,如果執行的同步程式碼出現異常,會自動將鎖讓出。
同步程式碼塊的程式碼是同步執行的(一次執行完),而非同步程式碼塊的程式碼可以非同步執行。
要求鎖的獲取和釋放存在同一個塊結構中;當獲取了多個鎖時,它們必須以相反的順序釋放;
-
- 使用注意事項:區分鎖物件(鎖不同沒有互斥作用)
分類 |
具體分類 |
當前鎖物件 |
虛擬碼 |
同步 方法 |
例項方法 |
當前例項物件 |
public synchronized void myMethod(){...} |
靜態方法 |
類物件 |
public static synchronized void myMethod(){...} |
|
代 碼 塊 |
例項物件 |
當前例項物件 |
synchronized(this){...} |
Class物件 |
類物件 |
synchronized(MyClass.class){...} |
|
Object物件 |
例項物件obj |
synchronized(obj){...} |
-
- 原理:
Synchronized用於鎖住當前的物件。當執行到被synchronized修飾的程式碼時,需先獲取當前的鎖物件。獲取失敗,則進入阻塞佇列中等待;獲取成功則執行程式碼,執行完成後釋放鎖物件,並通知阻塞佇列。
-
- synchronized的happens-before關係:先加鎖後釋放鎖
- JMM中的記憶體可見性
鎖獲取成功時,從主存讀取共享變數到本地記憶體中;釋放鎖成功時,強制重新整理本地記憶體資料到主存中。
-
- Synchronized優化
使用的是悲觀鎖的策略,即同一時間只能有一個執行緒去獲得鎖。而CAS是樂觀鎖的策略,