單例模式下的懶漢式在多執行緒的情況下會出現安全隱患,所以需要加入同步機制,以解決問題,**如下:
class single
private static single s = null;
public static synchroized single getinstance()
} return s;
}
對以上**進行分析。假設現在有多個執行緒(thread-0,thread-1.......thread-n)同時執行,thread-0拿到鎖,判斷完if語句後,時間片執行完。cpu切換到thread-1,thread-1判斷鎖,但不能拿到鎖,所以不能執行。cpu又切換到thread-0繼續執行完。後面的其它執行緒每次進入時都需要先判斷鎖(這本就沒用了,因為thread-0已經建立了物件),然後在判斷s是否為空。增加了鎖判斷的次數,明顯降低了程式效率。改進方法,即加雙重判斷,減少判斷鎖的次數。**實現如下:
class single
private static single s = null;
public static single getinstance()
} return s; }}
這樣一旦某個執行緒建立了物件,其他執行緒在第一次if判斷時,不成立,即完成了當前方法的執行,減少了判斷鎖的次數,從而提高了效率。
小結:如何解決安全問題:加同步。如何解決低效問題:加雙重判斷。
單例模式的懶漢式在多執行緒的問題
我們都知道,單例設計模式中有兩種方法,一種是餓漢式,另外一種就是懶漢式,具體如下 餓漢式 package com.seven.exercise.testeception 單例模式,餓漢式 author seven public class singledemohunger private stati...
單例模式,懶漢式在多執行緒中的問題
singleton2實現單例模式,懶漢式 class singleton2 private static singleton2 singleton2 public static singleton2 getsingle2 catch interruptedexception e singleton2...
單例模式 懶漢式的一次多執行緒Debug
單例模式要要點就是乙個類只會存在乙個例項,要想達到這種效果,最重要的就是將構造方法設定為私有,然後通過static的方法來獲取物件。上述設計並不執行緒安全,因為在lazysingleton new lazysingletion 這一步可能會傳送執行緒的切換,導致出現多個lazysingletion物...