Java多執行緒之synchronized詳解
阿新 • • 發佈:2020-06-29
## 目錄
- synchronized簡介
- 同步的原理
- 物件頭與鎖的實現
- 鎖的優化與升級
- Monitor Record
- 鎖的對比
## synchronized簡介
`synchronized`關鍵字,一般稱之為“同步鎖”或者重量級鎖(JAVA SE 1.6之後引入了`偏向鎖`和`輕量級鎖`)。它具有可重入性.
根據鎖的鎖的“物件”不同可以分為物件鎖和類鎖:
- 物件鎖:
- 對於普通的同步方法,鎖的是當前例項的物件
- 對於同步方法塊,如果`synchronized`括號裡配置的是類的例項物件,則鎖的是配置的物件
- 類鎖:`Class`物件鎖
- 對於靜態同步方法,鎖的是當前類(具體說是當前類的Class物件)
- 對於同步方法塊,如果`synchronized`括號裡配置的是類的`Class`物件,則鎖的是當前類
類鎖其實也鎖的是一個物件,不過是特殊的`Class`物件,所以類鎖並不是真實存在的。但是他們之間有不同的目的
- 物件鎖用來控制例項方法之間的同步
- 類鎖是用來控制靜態方法(或者靜態變數互斥體)之間的同步的。
## 同步的原理
`JVM`基於進入和退出`Monitor`物件來實現方法的同步和程式碼塊同步。每個物件都有一個`Monitor`與之關聯,當其被佔用就會處於鎖定的狀態。
`Monitor`並不是一個物件,只是習慣了這樣一個稱呼,他被儲存在物件頭的`Mark Word`中。
在Java虛擬機器(HotSpot)中,Monitor是由ObjectMonitor實現的。
#### 程式碼塊的同步
測試程式碼如下:
```java
public class SynchronizedTest {
private void test2(){
synchronized (this){
System.out.println(Thread.currentThread().getName()+"獲取鎖"+this.toString());
}
}
}
```
檢視編譯後的位元組碼檔案如下(省略部分內容):
```
...
2 astore_1
3 monitorenter
4 getst