亚洲乱码中文字幕手机在线_人妻少妇被猛烈进入中文字幕_日本欧美大码A在线观看_国产成人欧美日本在线观看_女人自熨全过程直播

首頁 > 資訊 >

Java設(shè)計(jì)模式【單例模式】

2023-05-12 17:32:11 來源:博客園
Java設(shè)計(jì)模式【單例模式】單例模式

單例模式(Singleton Pattern)是一種創(chuàng)建型設(shè)計(jì)模式,其主要目的是確保一個(gè)類只有一個(gè)實(shí)例,并提供對該實(shí)例的唯一訪問點(diǎn)。


(資料圖)

優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

提供了對唯一實(shí)例的受控訪問。

由于在系統(tǒng)內(nèi)存中只存在一個(gè)對象,因此可以節(jié)約系統(tǒng)資源。

缺點(diǎn)

單例類的擴(kuò)展有很大的困難。

單例類的職責(zé)過重,在一定程度上違背了“單一職責(zé)原則”。

對象生命周期。 單例模式?jīng)]有提出對象的銷毀,在提供內(nèi)存的管理的開發(fā)語言中,只有單例模式對象自己才能將對象實(shí)例銷毀,因?yàn)橹挥兴鼡碛袑?shí)例的引用。 在各種開發(fā)語言中,比如C++,其他類可以銷毀對象實(shí)例,但是這么做將導(dǎo)致單例類內(nèi)部的指針指向不明。

單例模式的使用餓漢模式靜態(tài)成員變量
/** * @author Physicx * @date 2023/5/12 下午10:13 * @desc 單例 * Created with IntelliJ IDEA */public class Singleton {    //初始化實(shí)例對象    private static final Singleton instance = new Singleton();    //私有化構(gòu)造方法    private Singleton() {    }    //提供獲取實(shí)例對象方法    public static Singleton getInstance() {        return instance;    }}
靜態(tài)代碼塊
/** * @author Physicx * @date 2023/5/12 下午10:13 * @desc 單例 * Created with IntelliJ IDEA */public class Singleton {    //實(shí)例對象    private static final Singleton instance;    static {        instance = new Singleton();    }    //私有化構(gòu)造方法    private Singleton() {    }    //提供獲取實(shí)例對象方法    public static Singleton getInstance() {        return instance;    }}

餓漢式單例的寫法適用于單例對象較少的情況,這樣寫可以保證絕對的線程安全,執(zhí)行效率比較高。但是缺點(diǎn)也很明顯,餓漢式會(huì)在類加載的時(shí)候就將所有單例對象實(shí)例化,這樣系統(tǒng)中如果有大量的餓漢式單例對象的存在,系統(tǒng)初始化的時(shí)候會(huì)造成大量的內(nèi)存浪費(fèi),換句話說就是不管對象用不用,對象都已存在,占用內(nèi)存。

懶漢模式
public class Singleton {    //實(shí)例對象    private static Singleton instance;    //私有化構(gòu)造方法    private Singleton() {    }    //提供獲取實(shí)例對象方法(線程安全)    public static synchronized Singleton getInstance() {        if (instance == null) {            instance = new Singleton();        }        return instance;    }}

線程安全的一種懶漢式寫法,在類第一次使用的時(shí)候初始化,獲取實(shí)例的靜態(tài)方法由synchronized修飾,所以是線程安全的。這種方法每次獲取實(shí)例對象都加鎖同步,效率較低。

雙重檢測機(jī)制(DCL)
public class Singleton {    //實(shí)例對象    private static volatile Singleton instance;    //私有化構(gòu)造方法    private Singleton() {    }    //提供獲取實(shí)例對象方法    public static Singleton getInstance() {        if (instance == null) {            //加鎖處理            synchronized (Singleton.class) {                if (instance==null) {                    //初始化                    instance = new Singleton();                }            }        }        return instance;    }}

實(shí)例對象必須用 volatile修飾,否則極端情況可能出現(xiàn)安全隱患。

以上初始化對象代碼被編譯后會(huì)變成以下三條指令:

分配對象的內(nèi)存空間。

初始化對象。

設(shè)置instance指向剛才分配的內(nèi)存空間。

如果按照上面的執(zhí)行順序則不加volatile沒有問題,但是CPU或編譯器為了提高效率,可能會(huì)進(jìn)行指令重排,最終順序變?yōu)椋?/p>

分配對象的內(nèi)存空間。

設(shè)置instance指向剛才分配的內(nèi)存空間。

初始化對象。

當(dāng)兩個(gè)線程同時(shí)獲取實(shí)例對象時(shí),線程A已經(jīng)將instance指向分配空間但未初始化對象,線程B此時(shí)第一次判空已不為空,于是返回instance實(shí)例,但是此時(shí)返回的實(shí)例未初始化會(huì)導(dǎo)致后續(xù)空指針異常。

DCL這種方式同樣也是類第一次使用的時(shí)候初始化,初始化代碼synchronized修飾線程安全,這種方式只會(huì)第一次實(shí)例對象才會(huì)進(jìn)行同步,因此效率高。

《Java Concurrency in Practice》作者Brian Goetz在書中提到關(guān)于DCL的觀點(diǎn):促使DCL模式出現(xiàn)的驅(qū)動(dòng)力(無競爭同步的執(zhí)行速度很慢,以及JVM啟動(dòng)時(shí)很慢)已經(jīng)不復(fù)存在,因而它不是一種高效的優(yōu)化措施。延遲初始化占位類模式(靜態(tài)內(nèi)部類)能帶來同樣的優(yōu)勢,并且更容易理解。

靜態(tài)內(nèi)部類(延遲初始化)
public class Singleton {    //私有化構(gòu)造方法    private Singleton(){}    //靜態(tài)內(nèi)部類(被調(diào)用時(shí)加載)    private static class SingletonHandle {        private static final Singleton instance = new Singleton();    }    //提供獲取實(shí)例對象方法    public static Singleton getInstance() {        return SingletonHandle.instance;    }}

利用靜態(tài)內(nèi)部類被調(diào)用時(shí)才加載的特性,通過靜態(tài)初始化初始Singleton對象,由于JVM將在初始化期間獲得一個(gè)鎖,并且每個(gè)線程都至少獲取一次這個(gè)鎖以確保這個(gè)類已經(jīng)加載,因此在靜態(tài)初始化期間,內(nèi)存寫入操作將自動(dòng)對所有線程可見。因此無論是在被構(gòu)造期間還是被引用時(shí),靜態(tài)初始化的對象都不需要顯式的同步。

線程安全,效率高,使用的時(shí)候才會(huì)初始化不浪費(fèi)內(nèi)存。

《Java Concurrency in Practice》作者Brian Goetz 推薦這種單例實(shí)現(xiàn)方式。

枚舉實(shí)現(xiàn)方式

除了以上幾種常見的實(shí)現(xiàn)方式之外,Google 首席 Java 架構(gòu)師、《Effective Java》一書作者、Java集合框架的開創(chuàng)者Joshua BlochEffective Java一書中提到:單元素的枚舉類型已經(jīng)成為實(shí)現(xiàn)Singleton的最佳方法。

在這種實(shí)現(xiàn)方式中,既可以避免多線程同步問題;還可以防止通過反射和反序列化來重新創(chuàng)建新的對象。

public class Singleton {    //私有化構(gòu)造方法    private Singleton() {}    enum SingletonEnum {        SINGLETON;        private final Singleton instance;        SingletonEnum() {            instance = new Singleton();        }        //提供獲取實(shí)例對象方法        public Singleton getInstance() {            return instance;        }    }}

調(diào)用方式如下:

public static void main(String[] args) {        Singleton instance1 = Singleton.SingletonEnum.SINGLETON.getInstance();        Singleton instance2 = Singleton.SingletonEnum.SINGLETON.getInstance();        System.out.println(instance2 == instance1);    }

普通的單例模式是可以通過反射和序列化/反序列化來破解的,jvm虛擬機(jī)會(huì)保證枚舉類型不能被反射并且構(gòu)造函數(shù)只被執(zhí)行一次,而Enum由于自身的特性問題,是無法破解的。當(dāng)然,由于這種情況基本不會(huì)出現(xiàn),因此我們在使用單例模式的時(shí)候也比較少考慮這個(gè)問題。

總結(jié)
實(shí)現(xiàn)方式優(yōu)點(diǎn)缺點(diǎn)
餓漢模式線程安全,效率高非懶加載
懶漢模式線程安全,懶加載效率低
雙重檢測機(jī)制線程安全,懶加載,效率高
靜態(tài)內(nèi)部類線程安全,懶加載,效率高
枚舉線程安全,效率高非懶加載

由于單例模式的枚舉實(shí)現(xiàn)代碼比較簡單,而且又可以利用枚舉的特性來解決線程安全和單一實(shí)例的問題,還可以防止反射和反序列化對單例的破壞,因此在很多書和文章中都強(qiáng)烈推薦將該方法作為單例模式的最佳實(shí)現(xiàn)方法

參考:單例模式詳解(知乎文章)

設(shè)計(jì)模式相關(guān)其他文章:Java設(shè)計(jì)模式總結(jié)

標(biāo)簽:

Java設(shè)計(jì)模式【單例模式】

Java設(shè)計(jì)模式【單例模式】單例模式單例模式(SingletonPattern)是一種創(chuàng)建型設(shè)計(jì)模式,其主要目的是確保一

2023-05-12

全球熱門:硅業(yè)分會(huì):短期內(nèi)需求偏弱 硅價(jià)或低位震蕩

5月12日,中國有色金屬工業(yè)協(xié)會(huì)硅業(yè)分會(huì)發(fā)布消息稱,本周工業(yè)硅現(xiàn)貨市場運(yùn)行偏弱,硅價(jià)整體下行。展望后市

2023-05-12

牛年最旺女孩名字_牛年是哪年-今熱點(diǎn)

1、1901年、1913年、1925年、1937年、1949年、1961年、1973年、1985年、1997年、2009

2023-05-12

環(huán)球熱文:株洲主城區(qū)新增監(jiān)控位置公布 不禮讓行人抓拍系統(tǒng)已上線

(通訊員龍百惠張人允)為了維護(hù)道路交通秩序,預(yù)防和減少交通事故,保護(hù)交通參與者的人身和財(cái)產(chǎn)安全,提高

2023-05-12

環(huán)球視訊!王老吉廣告詞分析-王老吉廣告詞

1、王老吉的廣告詞是:怕上火,喝王老吉!2、吉慶時(shí)分,當(dāng)然是王老吉!普天同慶,當(dāng)然是王老吉!3、180余年

2023-05-12

鼓樓巧治泵站前池水質(zhì) 改善居民生活環(huán)境 天天熱消息

鼓樓巧治泵站前池水質(zhì)改善居民生活環(huán)境“微管家”“安家”鼓樓,濕地“自凈”水體近日,在鼓樓區(qū)中央北...

2023-05-12

天天最資訊丨美媒:銀行股券商股成中國股市新熱點(diǎn)

參考消息網(wǎng)5月11日報(bào)道據(jù)美國《華爾街日報(bào)》網(wǎng)站5月9日報(bào)道,當(dāng)美國投資者對銀行股感到擔(dān)憂時(shí),中國的銀行

2023-05-11

2022年云南年平均工資公布!這些行業(yè)工資最高

5月11日,云南省統(tǒng)計(jì)局公布2022年云南省城鎮(zhèn)單位就業(yè)人員年平均工資情況。

2023-05-11

《看你怎么秀》裝修驗(yàn)房通關(guān)攻略分享

看你怎么秀這是一款不錯(cuò)的游戲,現(xiàn)在很多網(wǎng)友都在玩,九游小編注意到不少小伙伴都反應(yīng)對《看你怎么秀》裝修

2023-05-11

無服務(wù)是卡的問題還是手機(jī)的問題_無服務(wù) 天天快訊

1、無服務(wù)就是沒有接入網(wǎng)5261絡(luò)。2、無服務(wù)的情況包括4102:手機(jī)1653SIM卡與手機(jī)接觸不良,導(dǎo)致手機(jī)與網(wǎng)絡(luò)基站

2023-05-11

熱門看點(diǎn):家樂福上海供應(yīng)鏈公司被強(qiáng)執(zhí)176萬

家樂福旗下公司被強(qiáng)制執(zhí)行超百萬 天眼查App顯示,近日,家樂福(上海)供應(yīng)鏈管理有限公司新增3則被執(zhí)行人

2023-05-11

環(huán)球熱點(diǎn)!小孩鼻子上長膿包型痘痘怎么辦_膿包型痘痘怎么辦

1、然后應(yīng)用過氧化苯甲?;蚩肆置顾鼗蚍蛭鞯厮徇M(jìn)行抗炎治療。2、同時(shí)避免抓撓,誘發(fā)感染。3、忌辛辣油膩甜

2023-05-11

澳研究發(fā)現(xiàn):皮膚癌可能潛伏在正常皮膚中|當(dāng)前速讀

中新網(wǎng)悉尼5月11日電據(jù)澳大利亞第9新聞11日報(bào)道,昆士蘭大學(xué)的一項(xiàng)新研究發(fā)現(xiàn),肉眼并不總是可以看到陽光損

2023-05-11

基于SEA浩瀚架構(gòu)打造,沃爾沃EX30將于6月7日首發(fā) 當(dāng)前消息

日前,沃爾沃官方宣布稱其旗下全新純電動(dòng)SUVEX30將于歐洲時(shí)間6月7日正式亮相,并在特定國家或地區(qū)同步開啟

2023-05-11

大學(xué)生體能測試怎么查成績詢軍人考核表格換算公式

1、大學(xué)生體能測試怎么查成績一:體育本科綜合分以750分為滿分計(jì)算,具體折算方法:本科綜合分=考生總分×

2023-05-11

每日聚焦:騰訊課堂教師端使用教程_騰訊課堂教師客戶端

1、有啊,PC版的QQ就是客戶端如果沒有看到就點(diǎn)擊上面的加號,如圖:然后會(huì)出現(xiàn)一個(gè)選擇界面,把騰訊課堂選上

2023-05-11

快看點(diǎn)丨進(jìn)賢縣發(fā)布大霧黃色預(yù)警

【來源:進(jìn)賢縣氣象臺】進(jìn)賢縣氣象臺2023年05月10日22時(shí)38分發(fā)布大霧黃色預(yù)警信號:預(yù)計(jì)未來12小時(shí)內(nèi),白圩

2023-05-11

安徽蚌埠經(jīng)開區(qū)綜合執(zhí)法局開展計(jì)量器具監(jiān)督檢查行動(dòng)-全球訊息

中國質(zhì)量新聞網(wǎng)訊近日,安徽蚌埠經(jīng)開區(qū)綜合執(zhí)法局聚焦商超、飯店、菜場等民生密切場所,開展嚴(yán)厲打擊計(jì)量違

2023-05-11

何宇鑫:5.11CPI喜迎“10連降”!黃金多頭要反攻了?

每個(gè)人都不是你所看到的那個(gè)樣子,他們都是一邊是長著翅膀純潔善良的天使,一邊是拿著夜叉面目猙獰的惡魔。

2023-05-11

楊瀾方辟謠移民傳聞:我一直是中國人,沒改國籍|速看

近日,楊瀾方面針對一些不實(shí)的移民和改國籍傳聞發(fā)布了一則聲明,明確表示楊瀾女士一直是中國公民,沒有移民

2023-05-11

為什么這屆年輕人基本不走親戚了?

這屆年輕人基本不走親戚了的原因可能有以下幾個(gè)方面:1 社交方式的改變:隨著社交媒體和移動(dòng)通信技術(shù)的發(fā)展

2023-05-11

世界熱議:數(shù)據(jù)挖掘需求巨大 存力一體化成行業(yè)熱點(diǎn)

【環(huán)球網(wǎng)科技綜合報(bào)道】5月10日消息,近日,在東數(shù)西算下數(shù)據(jù)存力發(fā)展研討會(huì)上,華中科技大學(xué)武漢光電國家

2023-05-11

貨源增多,近期復(fù)合肥價(jià)格行情快報(bào)(5月11日) 即時(shí)看

復(fù)合肥價(jià)格:今日國內(nèi)復(fù)合肥市場局部低端價(jià)格貨源增多。其中兩河及山東地區(qū),玉米肥走貨尚可,高端保底、低

2023-05-11

gtx550ti相當(dāng)于什么顯卡_gtx550ti顯卡怎么樣_環(huán)球信息

1、你好樓主說跟GTX650GT740的水準(zhǔn)可以無視GTX650跟GT740一樣水準(zhǔn)但上面者性能是明顯比550Ti高一

2023-05-11

河南一季度電子商務(wù)增速回升 跨境電商持續(xù)增長|每日熱議

中新網(wǎng)鄭州5月10日電(楊大勇)記者10日從河南省統(tǒng)計(jì)局獲悉,該省今年一季度商品、服務(wù)類電子商務(wù)交易額為315

2023-05-11

每日視訊:2023年中國品牌日活動(dòng)開幕,北京展館聚焦科技創(chuàng)新等五大板塊

【環(huán)時(shí)深度】兩大危機(jī)正同時(shí)震蕩美元霸權(quán)!

足壇狙擊手無敵!哈蘭德或成歷史第一得分手,跟C羅穆勒相比如何

【焦點(diǎn)熱聞】國際原油期貨收跌 美布兩油均跌超1%

錯(cuò)過全部紅土熱身賽納達(dá)爾能出戰(zhàn)法網(wǎng)嗎 天天微頭條

世界觀速訊丨廣州數(shù)據(jù)交易所打造全國算力共享新模式 加快推動(dòng)公共數(shù)據(jù)賦能實(shí)體經(jīng)濟(jì)

5月10日基金凈值:南方希元轉(zhuǎn)債最新凈值1.5127,跌0.64%_全球觀察

天天微速訊:特朗普被裁定性侵、賠償500萬美元,如何影響大選?

德賽西威:接受天蟲資本管理有限公司等機(jī)構(gòu)調(diào)研 焦點(diǎn)訊息

高齡能不能轉(zhuǎn)行做程序員?

鵝卵石到哪里去撿_鵝卵石撿玉石的方法

全球微速訊:崩壞星穹鐵道模擬宇宙6必帶角色有哪些

洛神賦圖賞析_關(guān)于洛神賦圖內(nèi)容賞析

基金“烏龍”?大V出手,醫(yī)療基金LOF一度直逼漲停

Realme發(fā)布真我11Pro+:兩億像素單鏡頭變焦 售2099元起 前沿資訊

90年我哥結(jié)婚時(shí)把客廳和主臥之間的墻給拆了,鄰居沒說什么,不相干的倒是說了閑話|焦點(diǎn)速讀

當(dāng)前觀點(diǎn):真龍主宰(真龍主宰)

李清照:一剪梅_李清照的古詩詞 一剪梅 原文是什么|環(huán)球快報(bào)

申請離婚賠償流程

世界報(bào)道:紅星美凱龍家居生活廣場開業(yè)_紅星美凱龍家居生活MALL

2023佛山三水50公里公益徒步報(bào)名多少錢?

手游用上PC游戲優(yōu)化“神技”!天璣9200+加入VRS技術(shù)支持

行業(yè)風(fēng)向標(biāo) | 政策預(yù)期升溫,新能源車估值持續(xù)修復(fù)

磷酸錳商品報(bào)價(jià)動(dòng)態(tài)(2023-05-10)_世界觀熱點(diǎn)

文科大學(xué)排名2022最新排名_本二文科大學(xué) 最新資訊

Copyright @  2015-2022 太平洋家電網(wǎng)版權(quán)所有  備案號: 豫ICP備2022016495號-17   聯(lián)系郵箱:93 96 74 66 9@qq.com