保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。
資料庫連線、快取操作、分布式儲存。
思考:既然是單例,那就不能讓大家隨隨便便new 了,否則,你new乙個,我new乙個,還如何保證單例呢?餓漢式:類載入時便已初始化例項,用空間換時間,不管現在是否使用,先建立了再說;執行緒安全嗎?可以通過反射機制攻擊;執行緒安全[多個類載入器除外];不讓大家new,那就讓類自己new吧,怎麼做到呢?構造器私有;
自己new完了,大家如何獲取例項呢?那就對外提供乙個方法吧,沒有類例項的物件,怎麼訪問這個方法呢?只能依靠類來訪問了,方法前加static吧;
方法是有了,可static方法只能訪問static變數啊,那就把變數也搞成static吧;
懶漢式:我懶我快樂,用的時候在建立例項被,不著急;具體細分為:雙重校驗鎖、內部類實現
列舉實現:簡單,一行**搞定;
/**
*餓漢式1
*/class singleton0
private
singleton0(){}
public
static singleton0 getinstance()
}/**
*餓漢式2
*/class singleton1
public
static singleton1 getinstance()
}//懶漢式:用的的時候在初始化例項;用時間換空間;執行緒安全嗎?
/***懶漢式1:大多數執行緒安全,但每次獲取例項都要加鎖,效率低下;
*/class singleton2
public
static
synchronized singleton2 getinstance()
return _singleton;
}}/**
*懶漢式2:大多數執行緒安全,有所改進,加鎖次數少了;
*雙重校驗鎖
*/class singleton3
public
static singleton3 getinstance()}}
return _singleton;
}}/**
*懶漢式3:執行緒安全;
*new singleton();這步非原子操作,jvm會進行重排序;導致執行緒不安全;
*volatile 可禁止重排序;
*/class singleton4
public
static singleton4 getinstance()}}
return _singleton;
}}/**
*懶漢式4:執行緒安全;
*內部類實現;
*/class singleton5
private
singleton5(){}
public
static singleton5 getinstance()
}/**
*懶漢式5:執行緒安全;
*內部類實現;
*/class singleton6
private
singleton6(){}
public
static
final singleton6 getinstance()
}/**
*上面提到的所有實現方式都有兩個共同的缺點:
*(1)都需要額外的工作(serializable、transient、readresolve())來
*實現序列化,否則每次反序列化乙個序列化的物件例項時都會建立乙個新的例。
*(2)使用反射強行呼叫私有構造器(如果要避免這種情況,可以修改構造器,讓
*它在建立第二個例項的時候拋異常)。
*//**
*列舉實現單例模式:簡潔,無償地提供了序列化機制,由jvm從根本上提供保
*障,絕對防止多次例項化。執行緒安全
*沒有延遲載入
*/enum singleton7
1.給obj分配記憶體,在棧中分配並初始化為null上面**編譯後生成的位元組碼檔案和反編譯生成的對應**如下截圖2.呼叫建構函式,生成物件例項,在堆中分配
3.把obj指向在堆中分配的物件
由於指令重排序優化,執行順序可能會變成1,3,2,
在多執行緒中,那麼當乙個執行緒執行完1,3之後,被另乙個執行緒搶占,
這時obj已經不是null了,就會直接返回。
然而2還沒有執行過,也就是說這個物件例項還沒有初始化過。
懶漢式的模型中懶漢式2即有此問題存在。
圖先放這裡,以後可能有用。
你真的懂單例模式嗎
單例模式 單例模式顧名思義,就是對於指定的類只有乙個例項,這樣可以節省系統資源,也省去過多的例項化導致物件版本太多,不易管理。1。首先需要保證該類不可以通過new來例項化。因為如果可以這樣,那麼就無法保證單例了。只需要把構造方法設定為private或者protected即可。2。既然外部無法訪問構造...
你真的會用GOOGLE嗎
平時很多人用google搜尋引擎搜尋資訊,經常搜尋 成千上萬的網頁,檢視幾頁就沒耐心找下去了。在google上搜尋資訊,不只輸入希望搜尋的片語這麼簡單,這樣是無法得到做好的搜尋結果的。google 為使用者提供了很多基本搜尋語法,熟練的運用google搜尋,將很快的搜到我們需要的結果。短語搜尋 布林...
Markdown 你真的會用嗎?
markdown指南 markdown basics 我有幾張阿里雲幸運券分享給你,用券購買或者公升級阿里雲相應產品會有特惠驚喜哦!把想要買的產品的幸運券都領走吧!快下手,馬上就要搶光了。我常用如 橫線分隔符 超級鏈結 markdown 常遇到的問題 縮排 每段文章我都會習慣性地做首行縮排,但如果直...