日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

java懒加载设计模式_java设计模式——单例模式

發布時間:2023/12/2 asp.net 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java懒加载设计模式_java设计模式——单例模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

整理一下設計模式的個人理解。

描述

單例模式是java中比較常見的一種設計模式,顧名思義為一個類只能創建一個實例,多用于全局對象,如:配置的加載,spring?bean加載各種配置(spring容器所有bean默認都是單例)

單例的特點為構造方法私有,因此必須內部進行實例化,并提供靜態訪問方法為其他對象提供該實例。即:

1、單例只能有一個實例

2、單例構造方法私有

3、單例必須自己創建唯一實例,并提供其他對象訪問該實例的靜態方法

優缺點

優點:由于單例模式只生成了一個實例,所以能夠節約系統資源,減少性能開銷,提高系統效率,同時也能夠嚴格控制客戶對它的訪問。

缺點:因為系統中只有一個實例,這樣就導致了單例類的職責過重,違背了“單一職責原則”,沒有接口,不能繼承,不方便擴展。

實現

1> 懶漢式-線程不安全

public classSingleton1 {private staticSingleton1 instance;/*** 構造方法私有*/

privateSingleton1() {

}/*** 提供靜態訪問實例方法

* 懶加載,其他地方用到該實例時調用該方法/創建實例,多線程時可能會創建多個實例,線程不安全

*

*@return

*/

public staticSingleton1 getInstance() {if (instance == null) {

instance= newSingleton1();

}returninstance;

}

}

上述單例在多線程下會存在線程安全問題,比較直觀的解決方案是直接在方法上加同步鎖,以保證只會創建一個實例

2> 懶漢式-線程安全(增加同步鎖,多線程排隊等待,會影響效率)

public classSingleton2 {private staticSingleton2 instance;/*** 構造方法私有*/

privateSingleton2() {

}/*** 提供靜態訪問實例方法

* 懶加載,其他地方用到該實例時調用該方法/創建實例,增加同步鎖,保證線程安全

*

*@return

*/

public static synchronizedSingleton2 getInstance() {if (instance == null) {

instance= newSingleton2();

}returninstance;

}

}

3>?餓漢式(類加載時創建,線程安全)

類加載時即創建實例,后續直接獲取該實例,好處為永遠保持唯一線程安全,壞處為即使該實例永遠也用不到也會創建,浪費內存資源。

備注:考慮到規范,正常如果是永遠不用的實例,就應該刪除,所以一般也比較推薦使用餓漢式創建單例

public classSingleton3 {//直接實例化

private static Singleton3 instance = newSingleton3();privateSingleton3() {

}/*** 直接返回已實例化的實例

*

*@return

*/

public staticSingleton3 getInstance() {returninstance;

}

}

4>?雙重校驗鎖

instance聲明為volatile線程可見,以防止重排序造成線程不安全(重排序參考:https://blog.csdn.net/ym123456677/article/details/79700623)

public classSingleton4 {//volatile 全局線程可見

private volatile staticSingleton4 instance;privateSingleton4() {

}/*** 獲取實例 -- 雙重校驗,先判斷實例是否存在,不存在對類增加同步鎖,保證只創建一次

*

*@return

*/

public staticSingleton4 getInstance() {if (instance == null) {synchronized (Singleton4.class) {if (instance == null) {

instance= newSingleton4();

}

}

}returninstance;

}

}

5>?靜態內部類(明確指定要實現懶加載時使用)

public classSingleton5 {private static classinner {//聲明為final 不可變

private static final Singleton5 INSTANCE = newSingleton5();

}privateSingleton5() {

}/*** 獲取實例 -- (懶加載)第一個線程進來時就創建實例,并賦值給final常量INSTANCE,后續任何線程調用該方法,直接獲取INSTANCE

*

*@return

*/

public staticSingleton5 getInstance() {returninner.INSTANCE;

}

}

6>?枚舉

枚舉為單例的最佳實踐

public enumSingleton6 {

RED,

GREEN,

BLACK

}

考慮到實際應用,單例一般情況下使用餓漢式,明確要求實現懶加載時使用靜態內部類,不過在實際應用中,單獨使用的單例都不多了,配置一般都是通過spring?bean的方式配置config,枚舉使用較多,對于確定的類型、狀態等,直接使用枚舉。

總結

以上是生活随笔為你收集整理的java懒加载设计模式_java设计模式——单例模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。