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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java设计模式之创建型:单例模式

發(fā)布時間:2024/9/30 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java设计模式之创建型:单例模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、什么是單例模式:

????????單例模式可以確保系統(tǒng)中某個類只有一個實例,該類自行實例化并向整個系統(tǒng)提供這個實例的公共訪問點(diǎn),除了該公共訪問點(diǎn),不能通過其他途徑訪問該實例。單例模式的優(yōu)點(diǎn)在于:

  • 系統(tǒng)中只存在一個共用的實例對象,無需頻繁創(chuàng)建和銷毀對象,節(jié)約了系統(tǒng)資源,提高系統(tǒng)的性能
  • 可以嚴(yán)格控制客戶怎么樣以及何時訪問單例對象。

單例模式有以下特點(diǎn):

  • (1)單例類只能有一個實例;
  • (2)單例類必須自己創(chuàng)建自己的唯一實例;
  • (3)單例類必須給所有其他對象提供這一實例。

????????在計算機(jī)系統(tǒng)中,線程池、緩存、日志對象、對話框、打印機(jī)、顯卡的驅(qū)動程序?qū)ο蟪1辉O(shè)計成單例,這些應(yīng)用都或多或少具有資源管理器的功能。每臺計算機(jī)可以有若干個打印機(jī),但只能有一個Printer Spooler,以避免兩個打印作業(yè)同時輸出到打印機(jī)中。每臺計算機(jī)可以有若干通信端口,系統(tǒng)應(yīng)當(dāng)集中管理這些通信端口,以避免一個通信端口同時被兩個請求同時調(diào)用??傊?#xff0c;選擇單例模式就是為了避免不一致狀態(tài),避免政出多頭。

????????單例模式的寫法有好幾種,這里主要介紹三種:懶漢式單例、餓漢式單例、登記式單例。

二、懶漢式單例:

//懶漢式單例類.在第一次調(diào)用的時候?qū)嵗约? public class Singleton {private Singleton() {}private static Singleton single=null;//靜態(tài)工廠方法 public static Singleton getInstance() {if (single == null) { single = new Singleton();} return single;} }

Singleton 通過私有化構(gòu)造函數(shù),避免類在外部被實例化,而且只能通過?getInstance() 方法獲取 Singleton 的唯一實例。但是以上懶漢式單例的實現(xiàn)是線程不安全的,在并發(fā)環(huán)境下可能出現(xiàn)多個 Singleton 實例的問題。要實現(xiàn)線程安全,有以下三種方式,都是對 getInstance() 這個方法改造,保證了懶漢式單例的線程安全:

線程安全:如果程序每次運(yùn)行結(jié)果都和單線程運(yùn)行的結(jié)果是一樣的,而且其他的變量的值也和預(yù)期的是一樣的,就是線程安全的。

1、在 getInstance() 方法上加同步機(jī)制:

public static synchronized Singleton getInstance() {if (single == null) { single = new Singleton();} return single; }

在方法調(diào)用上加了同步,雖然線程安全了,但是每次都要同步,會影響性能,畢竟99%的情況下是不需要同步的。

2、雙重檢查鎖定:

//懶漢式單例類.在第一次調(diào)用的時候?qū)嵗约? public class Singleton {private Singleton() {}private volatile static Singleton singleton=null;public static Singleton getInstance() {if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }

(1)為什么?getInstance() 方法內(nèi)需要使用兩個 if (singleton == null) 進(jìn)行判斷呢?

假設(shè)高并發(fā)下,線程A、B 都通過了第一個 if 條件。若A先搶到鎖,new 了一個對象,釋放鎖,然后線程B再搶到鎖,此時如果不做第二個 if 判斷,B線程將會再 new 一個對象。使用兩個 if 判斷,確保了只有第一次調(diào)用單例的時候才會做同步,這樣也是線程安全的,同時避免了每次都同步的性能損耗。

(2)volatile 關(guān)鍵字的作用?

volatile 的作用主要是禁止指定重排序。假設(shè)在不使用 volatile 的情況下,兩個線程A、B,都是第一次調(diào)用該單例方法,線程A先執(zhí)行 singleton?= new Singleton(),但由于構(gòu)造方法不是一個原子操作,編譯后會生成多條字節(jié)碼指令,由于 JAVA的 指令重排序,可能會先執(zhí)行 singleton?的賦值操作,該操作實際只是在內(nèi)存中開辟一片存儲對象的區(qū)域后直接返回內(nèi)存的引用,之后 singleton?便不為空了,但是實際的初始化操作卻還沒有執(zhí)行。如果此時線程B進(jìn)入,就會拿到一個不為空的但是沒有完成初始化的singleton?對象,所以需要加入volatile關(guān)鍵字,禁止指令重排序優(yōu)化,從而安全的實現(xiàn)單例。

3、靜態(tài)內(nèi)部類:

public class Singleton { private static class LazyHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return LazyHolder.INSTANCE; } }

利用了類加載機(jī)制來保證初始化 instance 時只有一個線程,所以也是線程安全的,同時沒有性能損耗,這種比上面1、2都好一些,既實現(xiàn)了線程安全,又避免了同步帶來的性能影響。

三、餓漢式單例:

//餓漢式單例類.在類初始化時,已經(jīng)自行實例化 public class Singleton1 {private Singleton1() {}private static final Singleton1 single = new Singleton1();//靜態(tài)工廠方法 public static Singleton1 getInstance() {return single;} }

餓漢式在類創(chuàng)建的同時就已經(jīng)創(chuàng)建好一個靜態(tài)的對象供系統(tǒng)使用,以后不再改變,所以天生是線程安全的。

餓漢式和懶漢式區(qū)別:

(1)初始化時機(jī)與首次調(diào)用:

  • 餓漢式是在類加載時,就將單例初始化完成,保證獲取實例的時候,單例是已經(jīng)存在的了。所以在第一次調(diào)用時速度也會更快,因為其資源已經(jīng)初始化完成。
  • 懶漢式會延遲加載,只有在首次調(diào)用時才會實例化單例,如果初始化所需要的工作比較多,那么首次訪問性能上會有些延遲,不過之后就和餓漢式一樣了。

(2)線程安全方面:餓漢式天生就是線程安全的,可以直接用于多線程而不會出現(xiàn)問題,懶漢式本身是非線程安全的,需要通過額外的機(jī)制保證線程安全

四、登記式單例:

//類似Spring里面的方法,將類名注冊,下次從里面直接獲取。 public class Singleton3 {private static Map<String,Singleton3> map = new HashMap<String,Singleton3>();static{Singleton3 single = new Singleton3();map.put(single.getClass().getName(), single);}//保護(hù)的默認(rèn)構(gòu)造子protected Singleton3(){}//靜態(tài)工廠方法,返還此類惟一的實例public static Singleton3 getInstance(String name) {if(name == null) {name = Singleton3.class.getName();System.out.println("name == null"+"--->name="+name);}if(map.get(name) == null) {try {map.put(name, (Singleton3) Class.forName(name).newInstance());} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}return map.get(name);}//一個示意性的商業(yè)方法public String about() { return "Hello, I am RegSingleton."; } public static void main(String[] args) {Singleton3 single3 = Singleton3.getInstance(null);System.out.println(single3.about());} }

登記式單例實際上維護(hù)了一組單例類的實例,將這些實例存放在一個Map(登記薄)中,對于已經(jīng)登記過的實例,則從Map直接返回,對于沒有登記的,則先登記,然后返回。


設(shè)計模式系列文章:

Java設(shè)計模式之創(chuàng)建型:工廠模式詳解(簡單工廠+工廠方法+抽象工廠)

Java設(shè)計模式之創(chuàng)建型:建造者模式

Java設(shè)計模式之創(chuàng)建型:單例模式

Java設(shè)計模式之創(chuàng)建型:原型模式

Java設(shè)計模式之結(jié)構(gòu)型:適配器模式

Java設(shè)計模式之結(jié)構(gòu)型:裝飾器模式

Java設(shè)計模式之結(jié)構(gòu)型:代理模式

Java設(shè)計模式之結(jié)構(gòu)型:橋接模式

Java設(shè)計模式之結(jié)構(gòu)型:外觀模式

Java設(shè)計模式之結(jié)構(gòu)型:組合模式

Java設(shè)計模式之結(jié)構(gòu)型:享元模式

Java設(shè)計模式之行為型:策略模式

Java設(shè)計模式之行為型:模板方法模式

Java設(shè)計模式之行為型:責(zé)任鏈模式

Java設(shè)計模式之行為型:觀察者模式

Java設(shè)計模式之行為型:訪問者模式

Java設(shè)計模式之行為型:中介者模式

Java設(shè)計模式之行為型:命令模式

Java設(shè)計模式之行為型:狀態(tài)模式

Java設(shè)計模式之行為型:備忘錄模式

Java設(shè)計模式之行為型:迭代器模式

Java設(shè)計模式之行為型:解釋器模式


參考文章:https://blog.csdn.net/jason0539/article/details/23297037

總結(jié)

以上是生活随笔為你收集整理的Java设计模式之创建型:单例模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 天天骑夜夜操 | 精品一区二区三区免费毛片 | 精品国产a| 婷婷色影院 | 九九热免费视频 | 捆绑japanhdxxxxvideos| 精品国产黄 | 欧洲中文字幕 | 欧美大屁股熟妇bbbbbb | 国产三级国产精品国产国在线观看 | 国产精品久久久久三级 | 中文字幕日韩欧美 | 美女色黄网站 | 美女毛片网站 | 制服丝袜亚洲 | 国产视频一区二区在线 | 久久久午夜 | 香蕉91视频 | 国产精品久久久久久久一区探花 | 四虎网站在线 | 中文字幕一区二区三区在线视频 | 国产1区在线观看 | 午夜视频网站 | 久久久久久国 | 欧美日韩一区二区三区在线 | 爱爱亚洲 | 国产精品三级电影 | 一级成人av | 亚洲高清av| 婷婷综合在线观看 | 黑人黄色片| 国模无码一区二区三区 | 深夜国产视频 | 日韩欧美理论片 | 91亚洲视频在线 | 香蕉视频亚洲一级 | 激情三区| 欧美精品一级二级 | 亚洲黄色一区二区三区 | 中文字幕免费中文 | 德国经典free性复古xxxx | 就爱操av | 久久视频一区二区三区 | 精品免费久久 | 91色在线观看 | 91视频在线看 | 五月婷婷俺也去 | 久久久久久一级片 | 亚洲激情黄色 | 免费人成又黄又爽又色 | 日韩精品第1页 | 国产酒店自拍 | 成人国产精品久久久 | 国产精品99久久久久久宅男 | 色姑娘久 | 国内精品久久久久久久久久久 | 日韩亚洲欧美精品 | 久久久久久久久久亚洲 | 日韩综合网 | 国产精品一区二区亚洲 | 超碰在线人人草 | 欧美高清大白屁股ass18 | 色播综合网 | 黑人和白人做爰 | 尤物视频免费在线观看 | 91 在线视频 | 久热久操| 午夜吃瓜 | 91免费国产| 天降女子 | 中文字幕有码视频 | 亚洲视频在线一区 | 亚洲国产影视 | 欧美在线色 | www.成人网.com| 成熟妇人a片免费看网站 | 国产精品第2页 | 三级久久久 | 九色蝌蚪视频 | 欧美日韩高清在线观看 | 人人爽人人爽人人片av | 深夜影院深a | 精品孕妇一区二区三区 | 九九久久免费视频 | a级片网站| 亚洲丝袜av | 中国免费看的片 | 日韩欧美视频一区二区 | 粗大黑人巨茎大战欧美成人免费看 | 久久精品国产精品 | 日韩精品久久久久久久 | 强行挺进白丝老师里呻吟 | 国产伊人久久 | 亚洲黄色影视 | 99精品一区二区三区 | 国产欧美第一页 | 日本亚洲综合 | 欧美一区二区公司 | 国产精品免费看片 |