JAVA 單例模式 你真的會用嗎?

2021-07-11 19:51:09 字數 2616 閱讀 1128

保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。

資料庫連線、快取操作、分布式儲存。

思考:既然是單例,那就不能讓大家隨隨便便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 常遇到的問題 縮排 每段文章我都會習慣性地做首行縮排,但如果直...