1. 程式人生 > >Java多執行緒之synchronized詳解

Java多執行緒之synchronized詳解

## 目錄 - 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