接著給出一段比較經典的**:
public class singleton
public static singleton getinstance()
} }return instance;
}}
我將這段**拆成一步一步的寫:
第一步:把構造方法私有化,使得其他類不能通過new例項化這個類的物件。
//第一步**
public class singleton
}
第二步:但是外部是需要用到這個類的物件的,為了讓外部獲得此類的例項物件,我們可以對外提供乙個獲取物件的方法getinstance()。
//第二步**
public class singleton
public singleton getinstance()
}
第三步:增加物件是否已經被建立的判斷,為了完成該步驟,建立乙個全域性變數instance
第四步:建立instance
//第三步、第四步**
public class singleton
public singleton getinstance()
return instance;
}}
第五步:外部呼叫getinstance方法需要通過 物件.getinstance()方式呼叫,但是因為類的構造器被私有了,外部不能建立物件,所以在getinstance方法前面加上static.
第六步:由於變數instance需要被靜態方法getinstance()呼叫,非靜態變數不能被靜態方法呼叫, 所以需要在instance前加上static,又因為instance物件是static的,所以必須用private修飾。因為如果用public修飾,外部就直接可以通過類名.instance訪問。
//第五步、第六步**
public class singleton
public static singleton getinstance()
return instance;
}}
第七步:在多執行緒環境下,if(instance == null)可能同時成立,此時要加鎖,鎖的是類物件。
//第七步**
package com.whj.offer;
public class singleton
public static singleton getinstance()
}return instance;
}}
第八步:多個執行緒都通過了第乙個if判斷,多個執行緒排隊依次獲取鎖,此時如果不加以限制,仍然會建立多個物件,為了避免這種情況的發生,需要再加乙個if判斷,做到雙重驗證。
//第八步**
public class singleton
public static singleton getinstance()
}} return instance;
}}
完整帶注釋的**:
public class singleton
/*** 第二步,建立獲取物件的方法發getinstance()
* 第三步驟增加物件是否已經建立的判斷,為了完成該步驟,建立乙個全域性變數instance
* 第五步外部呼叫getinstance方法需要通過物件.getinstance()方式呼叫,但是因為類的構造
* 器被私有了,不能建立物件,所以在getinstance方法前面加上static.
*/public static singleton getinstance() }}
return instance;
}}
告別死記硬背 英孚教育專家解讀自然拼讀
2019年7月12日 上海 現在很多小朋友都是從很小就開始學英語,可家長也難免會擔心,學英語連大人很多時候都分分鐘堅持不住,小朋友會不會覺得太枯燥?日前,全球英語培訓專家英孚教育青少兒英語推出了全新自然拼讀奇趣營,旨在培養寶貝們的英語語感,教會寶貝掌握發音規律,輕鬆學英語!英孚自然拼讀奇趣營選用的是...
單例模式 懶漢式單例模式
單例模式有餓漢時模式和懶漢式 單例模式也就是說同一類只返回乙個物件供外部類使用 懶漢式即延遲初始化單例。在多執行緒環境下,簡單的懶漢式會有執行緒安全。懶漢式單例模式解決線性安全問題如下 1 使用雙重檢查鎖機制解決執行緒安全問題。2 單例模式還有更好的解決方案,即使用靜態類方式。懶漢式單例模式典型 p...
單例模式(懶漢式)
在學習中遇到的單例模式懶漢式的例子和自己做的筆記 單例設計模式 確保乙個類只有乙個物件 author administrator public class singletonpattern 單例設計模式 懶漢式 不建立物件,在使用時再建立物件 1.構造器私有化 避免外部直接建立物件 2.宣告乙個私有...