synchronized 關鍵字裡的鎖

weixin_33859844發表於2017-03-09

synchronized 關鍵字的鎖有靜態態方法鎖,鎖是所在類的class檔案,非靜態方法裡程式碼塊的synchronized(this)鎖,和非靜態方法鎖的物件是一致的。synchronized(類的class)等。原理就是物件。

1、靜態方法的鎖是所在類的 class 檔案。

// 靜態方法
public static synchronized void test(){};

備註:靜態方法裡不能使用 this 關鍵字,因為呼叫靜態方法時堆記憶體裡不生成物件。

2、非靜態方法鎖,鎖其實是 this,也就是在堆記憶體裡new出來的那個物件。

// 非靜態方法
public synchronized void test(){};

3、程式碼塊鎖,鎖是this關鍵字。指堆記憶體裡 new 的那個物件。

public void test(){
      synchronized(this){
        // 程式碼塊
      }
}

4、鎖是某個類的位元組碼,一個類可以有多個位元組碼,只會有一個class原始檔。

public void test(){
      synchronized(Car.class){
        // 程式碼塊
      }
}

相關文章