单例模式小记【原创】
????? 中國的歷史上很少出現兩個皇帝并存的時期,是有,但不多,那我們就認為皇帝是個單例模式,在這個場景中,有皇帝,有大臣,大臣是天天要上朝參見皇帝的,今天參拜的皇帝應該和昨天、前天的一樣(過渡期的不考慮,別找茬哦),大臣磕完頭,抬頭一看,嗨,還是昨天那個皇帝,單例模式,絕對的單例模式,先看類圖:
?????
???? 單例模式最大的特點就是在類里有一個private構造函數,保證這個類不被其他類new出來。而getInstence是用來獲得此類唯一的有一個實例化對象的方法。
?
經典的單例模式代碼:
@SuppressWarnings("all")public class SingletonPattern {
private static SingletonPattern singletonPattern= null;
//限制住不能直接產生一個實例
private SingletonPattern(){
}
public SingletonPattern getInstance(){
if(this.singletonPattern == null){ //如果還沒有實例,則創建一個
this.singletonPattern = new SingletonPattern();
}
return this.singletonPattern;
}
}
?
???? 客戶端調用時,不能new出這個類的對象,只能通過getInstence是用來獲得此類唯一的有一個實例化對象的方法,而getInstence里有句關于類中靜態成員變量singletonPattern的存在判斷,保證其唯一性。
?
????? 當然這個例子有個很不完善的地方,就是遇到多線程問題時,假如現在有兩個線程A和線程B,線程A執行到?this.singletonPattern?=?new?SingletonPattern(),正在申請內存分配,可能需要0.001微秒,就在這0.001微秒之內,線程B執行到if(this.singletonPattern?==?null),你說這個時候這個判斷條件是true還是false?是true,那然后呢?線程B也往下走,于是乎就在內存中就有兩個SingletonPattern的實例了,看看是不是出問題了?
????? 如果你這個單例是去拿一個序列號或者創建一個信號資源的時候,會怎么樣?業務邏輯混亂!數據一致性校驗失敗!最重要的是你從代碼上還看不出什么問題,這才是最要命的!因為這種情況基本上你是重現不了的,不寒而栗吧,那怎么修改?有很多種方案,我就說一種,能簡單的、徹底解決問題的方案:
@SuppressWarnings("all")public class SingletonPattern {
private static final SingletonPattern singletonPattern= new SingletonPattern();
//限制住不能直接產生一個實例
private SingletonPattern(){
}
public synchronized static SingletonPattern getInstance(){
return singletonPattern;
}
}
直接new一個對象傳遞給類的成員變量singletonpattern,你要的時候getInstance()直接返回給你,解決問題!
另外,如果你不想singletonPattern?一個初始值,也可以通過synchronized關鍵字聲明getInstence方法,保證只有一個線程訪問此方法來解決。
?
?
轉載于:https://www.cnblogs.com/winkey4986/archive/2012/03/26/2417369.html
總結
以上是生活随笔為你收集整理的单例模式小记【原创】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jQuery源码研究01
- 下一篇: APL开发日志--2013-01-17