最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java的單例設(shè)計模式詳解

 更新時間:2018年12月22日 15:52:42   作者:pigdreams  
今天小編就為大家分享一篇關(guān)于Java的單例設(shè)計模式詳解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

1.什么是單例模式

  • 生成一個獨一無二的,保證任何時刻一個類只有一個實例的模式
  • 確保一個類只有一個實例,并提供一個全局訪問點
  • 可以在需要時才創(chuàng)建對象,避免了全局變量在程序啟動時就得創(chuàng)建對象的缺點。

2.經(jīng)典單例模式實現(xiàn)

public class MyInstance{
 //第一步:私有化構(gòu)造器,只有類自身才能調(diào)用構(gòu)造器外部類不能夠直接new出這個類的實例對象
 private MyInstance(){}
 //第二步:聲明一個全局靜態(tài)變量來記錄自身實例的對象,也是私有的,限制其它外部類訪問
 private static MyInstance myInstance;
 //第三步:提供一個外部可訪問的靜態(tài)公開方法,來獲得該類的唯一實例
 public static MyInstance getMyInstance(){
 //第四步:進(jìn)行判斷自身類對象如果為空,則創(chuàng)建一個實例
 if(myInstance==null){
  //這里的方法只執(zhí)行了一次,生成了一個唯一的類對象
  myInstance=new MyInstance();
 }
 //第五步:如果不為空,則返回該類對象,故由始至終,該類對象只初始化過一次,只有一個對象存在,這就是單例模式
 return myInstance;
 }
}

3.經(jīng)典模式存在的缺陷

這種經(jīng)典模式也稱之為懶漢式單例模式(lazy instantiaze),因為它是延遲化實例化的,即如果我們不需要這個實例,則它永遠(yuǎn)不會被初始化,只有在調(diào)用過一次實例化方法后,才會被創(chuàng)建出對象。

在多線程的情況下可能會產(chǎn)生并發(fā)問題,因為獲取單例的方法getMyInstance()有可能被多個線程同時訪問,這時就會有可能 創(chuàng)建出兩個以上的實例對象。這就要考慮要線程安全的問題了,解決問題就是在獲取實例方法處加一個同步鎖,這樣就能輕松地解決線程并發(fā)的問題了。

public static synchronized MyInstance getMyInstance(){
 //加同步鎖關(guān)鍵字synchronized,這樣在有線程訪問這個方法時,其它線程只能等待當(dāng)前線程訪問結(jié)束才能訪問這個方法。
 if(myInstance==null){
  //這里的方法只執(zhí)行了一次,生成了一個唯一的類對象
  myInstance=new MyInstance();
 }

4.多線程下同步所造成的性能問題

如果將獲取實例的方法進(jìn)行同步的話,會造成程序執(zhí)行的效率大大地下降,而且單例對象生成只要調(diào)用一次方法即可,之后每次調(diào)用這個方法時,同步都是一種累綴,有可能會拖垮程序的性能。

當(dāng)然如果你的程序?qū)τ谛阅艿囊蟛⒉皇呛芨叩脑挘猛降姆椒ǐ@取單例是最簡單而有效的。

為保證程序的性能并且又不會出現(xiàn)并發(fā)的問題,可以使用另一種生成單例對象的模式,叫做餓漢式單例模式(eagerly instantiaze)

public class MyInstance{
 //第一步:私有化構(gòu)造器
 private MyInstance(){}
 //第二步:聲明一個全局靜態(tài)變量來記錄自身實例的對象,并進(jìn)行實例化
 private static MyInstance myInstance=new MyInstance();
 //第三步:提供一個外部可訪問的靜態(tài)公開方法,來獲得該類的唯一實例
 public static MyInstance getMyInstance(){
 return myInstance;
 }

這個模式使JVM在加載這個類時會馬上創(chuàng)建唯一的單例對象,這樣就能保證任何線程訪問靜態(tài)單例變量myInstance時,單例對象一定被實例化過了。

5.利用雙重檢查加鎖來提升性能

  • 首先檢查實例是否已經(jīng)創(chuàng)建了,如果沒有才進(jìn)行同步獲取實例的方法,這樣就保證了實例方法只會在第一次獲取實例時會同步。
  • 這里要用到一個關(guān)鍵字volatile,此關(guān)鍵字確保了當(dāng)實例變量myInstance被初始化成實例對象時,多個線程能正確地處理實例變量。注意,這個關(guān)鍵字只有在Java1.5及以上的版本才會對雙重檢查加載生效。
public class MyInstance{
 //用關(guān)鍵字volatile修飾實例變量
 private volatile static MyInstance myInstance;
 //私有化構(gòu)造器
 private MyInstance(){}
 public static MyInstance getMyInstance(){
 //第一次檢查實例是否存在
 if(myInstance==null){
  //如果不存在則進(jìn)入同步區(qū)塊
  synchronized (MyInstance.class){
  if(myInstance==null){
   //第二次檢查,如果不為空才真正創(chuàng)建實例對象
   myInstance=new MyInstance();
  }
  } 
 }
 //如果不為空,則直接返回該類對象
 return myInstance;
 }
}

單例模式的所有情況都已經(jīng)總結(jié)完畢,一開始以為單例模式應(yīng)該是所有設(shè)計模式中最簡單易懂的了,沒想到看到四人幫的HeadFirst設(shè)計模式后發(fā)現(xiàn)還有這么多門道,真的是學(xué)無止境。

注:以上所有內(nèi)容皆總結(jié)自《HeadFirst 設(shè)計模式》

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接

相關(guān)文章

  • SpringBoot中使用Netty的實現(xiàn)示例

    SpringBoot中使用Netty的實現(xiàn)示例

    本文主要介紹了SpringBoot中使用Netty的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • Java異常鏈表throw結(jié)構(gòu)assert詳細(xì)解讀

    Java異常鏈表throw結(jié)構(gòu)assert詳細(xì)解讀

    這篇文章主要給大家介紹了關(guān)于Java中方法使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • SpringBoot3 響應(yīng)式網(wǎng)絡(luò)請求客戶端的實現(xiàn)

    SpringBoot3 響應(yīng)式網(wǎng)絡(luò)請求客戶端的實現(xiàn)

    本文主要介紹了SpringBoot3 響應(yīng)式網(wǎng)絡(luò)請求客戶端的實現(xiàn),文章詳細(xì)闡述了如何使用SpringBoot3的網(wǎng)絡(luò)請求客戶端進(jìn)行HTTP請求和處理響應(yīng),并提供了示例代碼和說明,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • OpenFeign設(shè)置header的三種方式總結(jié)

    OpenFeign設(shè)置header的三種方式總結(jié)

    在微服務(wù)間使用Feign進(jìn)行遠(yuǎn)程調(diào)用時需要在header中添加信息,下面這篇文章主要給大家介紹了關(guān)于OpenFeign設(shè)置header的三種方式,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • Springcloud Config配置中心使用與相關(guān)介紹

    Springcloud Config配置中心使用與相關(guān)介紹

    springcloud config是一個解決分布式系統(tǒng)的配置管理方案。它包含了 client和server兩個部分,server端提供配置文件的存儲、以接口的形式將配置文件的內(nèi)容提供出去,client端通過接口獲取數(shù)據(jù)、并依據(jù)此數(shù)據(jù)初始化自己的應(yīng)用
    2022-09-09
  • Spring AOP之@Around,@AfterReturning使用、切不進(jìn)去的解決方案

    Spring AOP之@Around,@AfterReturning使用、切不進(jìn)去的解決方案

    這篇文章主要介紹了Spring AOP之@Around,@AfterReturning使用、切不進(jìn)去的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 實例解析如何正確使用Java數(shù)組

    實例解析如何正確使用Java數(shù)組

    同一種類型數(shù)據(jù)的集合。其實數(shù)組就是一個容器。運算的時候有很多數(shù)據(jù)參與運算,那么首先需要做的是什么下面我們就一起來看看。
    2016-07-07
  • Java實現(xiàn)斷點下載功能的示例代碼

    Java實現(xiàn)斷點下載功能的示例代碼

    當(dāng)下載一個很大的文件時,如果下載到一半暫停,如果繼續(xù)下載呢?斷點下載就是解決這個問題的。本文將用Java語言實現(xiàn)斷點下載,需要的可以參考一下
    2022-05-05
  • SpringBoot整合Web開發(fā)之Json數(shù)據(jù)返回的實現(xiàn)

    SpringBoot整合Web開發(fā)之Json數(shù)據(jù)返回的實現(xiàn)

    這篇文章主要介紹了SpringBoot整合Web開發(fā)其中Json數(shù)據(jù)返回的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • java字符串反轉(zhuǎn)示例分享

    java字符串反轉(zhuǎn)示例分享

    這篇文章主要介紹了將一個字符串進(jìn)行反轉(zhuǎn)或者字符串中指定部分進(jìn)行反轉(zhuǎn)的方法,大家參考使用吧
    2014-01-01

最新評論

沙坪坝区| 福建省| 平度市| 华容县| 浦东新区| 德惠市| 曲水县| 刚察县| 福清市| 奉节县| 松江区| 铜陵市| 乌兰县| 拜泉县| 叙永县| 曲麻莱县| 师宗县| 呼图壁县| 平原县| 平江县| 靖江市| 绥中县| 威海市| 平江县| 晋州市| 平和县| 襄汾县| 彭州市| 扶绥县| 惠来县| 罗源县| 大田县| 临夏市| 平和县| 象州县| 渭源县| 阜新市| 阳新县| 甘肃省| 繁昌县| 宜阳县|