www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 芯聞號 > 充電吧
[導讀] 本文繼續(xù)介紹23種設計模式系列之單例模式。 概念:  Java中單例模式是一種常見的設計模式,單例模式的寫法有好幾種,這里主要介紹三種:懶漢式單例、餓漢式單例、登記式單例?! 卫J接幸韵绿攸c

本文繼續(xù)介紹23種設計模式系列之單例模式。

概念:
  Java中單例模式是一種常見的設計模式,單例模式的寫法有好幾種,這里主要介紹三種:懶漢式單例、餓漢式單例、登記式單例。
  單例模式有以下特點:
  1、單例類只能有一個實例。
  2、單例類必須自己創(chuàng)建自己的唯一實例。
  3、單例類必須給所有其他對象提供這一實例。
  單例模式確保某個類只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實例。在計算機系統(tǒng)中,線程池、緩存、日志對象、對話框、打印機、顯卡的驅動程序對象常被設計成單例。這些應用都或多或少具有資源管理器的功能。每臺計算機可以有若干個打印機,但只能有一個Printer Spooler,以避免兩個打印作業(yè)同時輸出到打印機中。每臺計算機可以有若干通信端口,系統(tǒng)應當集中管理這些通信端口,以避免一個通信端口同時被兩個請求同時調用。總之,選擇單例模式就是為了避免不一致狀態(tài),避免政出多頭。


一、懶漢式單例

[java]?view plain?copy ?print? //懶漢式單例類.在第一次調用的時候實例化自己??? 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通過將構造方法限定為private避免了類在外部被實例化,在同一個虛擬機范圍內,Singleton的唯一實例只能通過getInstance()方法訪問。

(事實上,通過Java反射機制是能夠實例化構造方法為private的類的,那基本上會使所有的Java單例實現(xiàn)失效。此問題在此處不做討論,姑且掩耳盜鈴地認為反射機制不存在。)

但是以上懶漢式單例的實現(xiàn)沒有考慮線程安全問題,它是線程不安全的,并發(fā)環(huán)境下很可能出現(xiàn)多個Singleton實例,要實現(xiàn)線程安全,有以下三種方式,都是對getInstance這個方法改造,保證了懶漢式單例的線程安全,如果你第一次接觸單例模式,對線程安全不是很了解,可以先跳過下面這三小條,去看餓漢式單例,等看完后面再回頭考慮線程安全的問題:


1、在getInstance方法上加同步

[java]?view plain?copy ?print? public?static?synchronized?Singleton?getInstance()?{?? ?????????if?(single?==?null)?{???? ?????????????single?=?new?Singleton();?? ?????????}???? ????????return?single;?? }??

2、雙重檢查鎖定

[java]?view plain?copy ?print? public?static?Singleton?getInstance()?{?? ????????if?(singleton?==?null)?{???? ????????????synchronized?(Singleton.class)?{???? ???????????????if?(singleton?==?null)?{???? ??????????????????singleton?=?new?Singleton();??? ???????????????}???? ????????????}???? ????????}???? ????????return?singleton;??? ????}??

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

[java]?view plain?copy ?print? public?class?Singleton?{???? ????private?static?class?LazyHolder?{???? ???????private?static?final?Singleton?INSTANCE?=?new?Singleton();???? ????}???? ????private?Singleton?(){}???? ????public?static?final?Singleton?getInstance()?{???? ???????return?LazyHolder.INSTANCE;???? ????}???? }???? 這種比上面1、2都好一些,既實現(xiàn)了線程安全,又避免了同步帶來的性能影響。


二、餓漢式單例

[java]?view plain?copy ?print? //餓漢式單例類.在類初始化時,已經(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)使用,以后不再改變,所以天生是線程安全的。

三、登記式單例(可忽略)

[java]?view plain?copy ?print? //類似Spring里面的方法,將類名注冊,下次從里面直接獲取。?? public?class?Singleton3?{?? ????private?static?Map?map?=?new?HashMap();?? ????static{?? ????????Singleton3?single?=?new?Singleton3();?? ????????map.put(single.getClass().getName(),?single);?? ????}?? ????//保護的默認構造子?? ????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());?? ????}?? }??

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

這里我對登記式單例標記了可忽略,我的理解來說,首先它用的比較少,另外其實內部實現(xiàn)還是用的餓漢式單例,因為其中的static方法塊,它的單例在類被裝載的時候就被實例化了。


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

從名字上來說,餓漢和懶漢,

餓漢就是類一旦加載,就把單例初始化完成,保證getInstance的時候,單例是已經(jīng)存在的了,

而懶漢比較懶,只有當調用getInstance的時候,才回去初始化這個單例。

另外從以下兩點再區(qū)分以下這兩種方式:


1、線程安全:

餓漢式天生就是線程安全的,可以直接用于多線程而不會出現(xiàn)問題,

懶漢式本身是非線程安全的,為了實現(xiàn)線程安全有幾種寫法,分別是上面的1、2、3,這三種實現(xiàn)在資源加載和性能方面有些區(qū)別。



2、資源加載和性能:

餓漢式在類創(chuàng)建的同時就實例化一個靜態(tài)對象出來,不管之后會不會使用這個單例,都會占據(jù)一定的內存,但是相應的,在第一次調用時速度也會更快,因為其資源已經(jīng)初始化完成,

而懶漢式顧名思義,會延遲加載,在第一次使用該單例的時候才會實例化對象出來,第一次調用時要做初始化,如果要做的工作比較多,性能上會有些延遲,之后就和餓漢式一樣了。

至于1、2、3這三種實現(xiàn)又有些區(qū)別,

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

第2種,在getInstance中做了兩次null檢查,確保了只有第一次調用單例的時候才會做同步,這樣也是線程安全的,同時避免了每次都同步的性能損耗

第3種,利用了classloader的機制來保證初始化instance時只有一個線程,所以也是線程安全的,同時沒有性能損耗,所以一般我傾向于使用這一種。


什么是線程安全?

如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程運行的結果是一樣的,而且其他的變量的值也和預期的是一樣的,就是線程安全的。

或者說:一個類或者程序所提供的接口對于線程來說是原子操作,或者多個線程之間的切換不會導致該接口的執(zhí)行結果存在二義性,也就是說我們不用考慮同步的問題,那就是線程安全的。


應用

以下是一個單例類使用的例子,以懶漢式為例,這里為了保證線程安全,使用了雙重檢查鎖定的方式:

[java]?view plain?copy ?print? public?class?TestSingleton?{?? ????String?name?=?null;?? ?? ????????private?TestSingleton()?{?? ????}?? ?? ????private?static?volatile?TestSingleton?instance?=?null;?? ?? ????public?static?TestSingleton?getInstance()?{?? ???????????if?(instance?==?null)?{???? ?????????????synchronized?(TestSingleton.class)?{???? ????????????????if?(instance?==?null)?{???? ???????????????????instance?=?new?TestSingleton();??? ????????????????}???? ?????????????}???? ???????????}??? ???????????return?instance;?? ????}?? ?? ????public?String?getName()?{?? ????????return?name;?? ????}?? ?? ????public?void?setName(String?name)?{?? ????????this.name?=?name;?? ????}?? ?? ????public?void?printInfo()?{?? ????????System.out.println("the?name?is?"?+?name);?? ????}?? ?? }??

可以看到里面加了volatile關鍵字來聲明單例對象,既然synchronized已經(jīng)起到了多線程下原子性、有序性、可見性的作用,為什么還要加volatile呢,原因已經(jīng)在下面評論中提到,

還有疑問可參考http://www.iteye.com/topic/652440
和http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html


[java]?view plain?copy ?print? public?class?TMain?{?? ????public?static?void?main(String[]?args){?? ????????TestStream?ts1?=?TestSingleton.getInstance();?? ????????ts1.setName("jason");?? ????????TestStream?ts2?=?TestSingleton.getInstance();?? ????????ts2.setName("0539");?? ?????????? ????????ts1.printInfo();?? ????????ts2.printInfo();?? ?????????? ????????if(ts1?==?ts2){?? ????????????System.out.println("創(chuàng)建的是同一個實例");?? ????????}else{?? ????????????System.out.println("創(chuàng)建的不是同一個實例");?? ????????}?? ????}?? }??

?運行結果:


結論:由結果可以得知單例模式為一個面向對象的應用程序提供了對象惟一的訪問點,不管它實現(xiàn)何種功能,整個應用程序都會同享一個實例對象。

對于單例模式的幾種實現(xiàn)方式,知道餓漢式和懶漢式的區(qū)別,線程安全,資源加載的時機,還有懶漢式為了實現(xiàn)線程安全的3種方式的細微差別。



更多設計模式:23種設計模式系列


作者:jason0539

博客:http://blog.csdn.net/jason0539(轉載請說明出處)




本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉