給靜態方法加同步鎖
我們知道利用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...