給靜態方法加同步鎖

2021-09-12 03:00:32 字數 955 閱讀 6161

給靜態方法加同步鎖

我們知道利用synchronized關鍵字可以解決執行緒安全的問題,synchronized可以加在**塊中,也可以加在同步方法中。synchronized加在方法中的時候等價於:

synchronized(this)

問題:靜態方法的鎖加在什麼物件上呢?

加鎖的時候要傳乙個object物件,但是static修飾的方法在載入的時候是沒有new出物件的,實際上這個鎖是加在當前類的位元組碼物件上。

單利設計模式有2種:

1.餓漢式

public class singal;

private static singal getinstance()

}

2.懶漢式

有人覺得上面那種的效率不是很高,於是就出現了下面一種,簡稱懶漢式

優點是可以實現延遲載入,效率高。

public class singal ;

private static singal getinstance()

return singal;

}}

分析:紅色標記的這段**會出現執行緒安全問題

當if(singal==null)這段**執行完後,另外乙個執行緒也搶到了cpu的執行權

並執行完,生成了乙個singal物件。等原執行緒回過頭也會生成乙個singal物件。

這樣就生成了2個singal物件了,執行緒安全問題也就這樣產生了。 

注:對上面**進行優化後,就不會出現執行緒安全問題,但是鎖是加在當前類的位元組碼

物件上的。

public class singal ;

private static singal getinstance()

}    return singal;}}

同步靜態方法與同步非靜態方法

可參考 同步方法 1 同步靜態方法 某個類object中的某個靜態方法staticmethod加上同步鎖之後,當某個執行緒thread呼叫staticmethod時該執行緒會獲取object類的鎖 當前object的鎖沒被其它執行緒獲取時,若當前object鎖被其它鎖獲取則會進行等待。此時其他任何執...

同步靜態方法

1 鎖 是資源類物件,同步方法,方法要寫在資源類中 2 資源類如果是單寫的,沒有實現runnable介面.同步方法要寫在資源類中,鎖要求唯一,靜態的同步方法,使用的鎖是card2.class 3 解釋類.class jvm 再去使用指定類 給每乙個類建立乙個 唯一的class 物件,也就是說每個類有...

同步靜態方法

同步靜態方法 修飾靜態方法,作用於當前類物件加鎖,進入同步 前要獲得當前類物件的鎖 同步監視器是當前類物件class c date.class private static int num 0 public static synchronized void add catch interrupted...