簡單說來,單例模式(也叫單件模式)的作用就是保證在整個應用程式的生命週期中,
任何乙個時刻,單例類的例項都只存在乙個(當然也可以不存在)。
具體實現就是把單例類的構造方法訪問許可權設定成private,然後在單例類裡面定義getinstance()方法來訪問構造方法
getinstance()通過如下方式保證該 singleton 只存在乙個例項:
首先這個 singleton 類會在在第一次呼叫 getinstance()時建立乙個例項,並將這個例項的引用封裝在自身類中,
然後以後呼叫 getinstance()時就會判斷這個 singleton 是否存在乙個例項了,如果存在,則不會再建立例項。
而是呼叫以前生成的類的例項,這樣下來,整個應用程式中便就只存在乙個例項了。
public class singleton
public
static singleton getinstance()
return singleton;
} }
單例模式很簡單,就是在建構函式中多了加乙個建構函式,訪問許可權是private的就可以了,這個模式是簡單,但是簡單中透著風險,風險?什麼風險?在乙個b/s專案中,每個http request請求到j2ee的容器上後都建立了乙個執行緒,每個執行緒都要建立同乙個單例物件,怎麼辦?
,假如現在有兩個執行緒a和執行緒b,執行緒a執行到 this.singletonpattern = new singletonpattern(),正在申請記憶體分配,可能需要0.001微秒,就在這0.001微秒之內,執行緒b執行到if(this.singletonpattern == null),你說這個時候這個判斷條件是true還是false?是true,那然後呢?執行緒b也往下走,於是乎就在記憶體中就有兩個singletonpattern的例項了,看看是不是出問題了?
如果你這個單例是去拿乙個序列號或者建立乙個訊號資源的時候,會怎麼樣?業務邏輯混亂!資料一致性校驗失敗!最重要的是你從**上還看不出什麼問題,這才是最要命的!因為這種情況基本上你是重現不了的,不寒而慄吧,那怎麼修改?有很多種方案,我就說一種,能簡單的、徹底解決問題的方案:
定義私有變數:
private static singleton singleton=new singleton();
單例模式小結
條件一 單例是保重乙個類只有乙個例項,條件二 並且提供乙個訪問他的全域性訪問點。如果只是構造乙個例項,為了防止外部呼叫該建構函式,將建構函式訪問許可權標記物protected或者private。提供全域性訪問點,需要在類中定義乙個static函式,返回類內唯一建構函式的例項。如下 要考慮多執行緒 屬...
單例模式小結
單例模式有5種實現方式,實現單例模式要掌握的要點 1 構造方法私有,為private 2 確保單例類只有乙個物件,尤其是多執行緒模式下 1.餓漢式 public class singleton public static singleton getinstance 2.懶漢式,有兩種寫法 非執行緒安...
單例設計模式小結
單例設計模式 單例模式用途 保證類在記憶體中只有乙個物件。單例模式案例 1 餓漢式 開發用這種方式。class singleton 2,建立本類物件 private static singleton s new singleton 3,對外提供公共的訪問方法 public static single...