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

JAVA實現(xiàn)單例模式的四種方法和一些特點

 更新時間:2013年03月26日 09:52:51   作者:  
JAVA實現(xiàn)單例模式的四種方法和一些特點,需要的朋友可以參考一下

一、餓漢式單例類

復(fù)制代碼 代碼如下:

public class Singleton 

    private Singleton(){ 

    } 

    private static Singleton instance = new Singleton(); 

    private static Singleton getInstance(){ 
        return instance; 
    } 

特點:餓漢式提前實例化,沒有懶漢式中多線程問題,但不管我們是不是調(diào)用getInstance()都會存在一個實例在內(nèi)存中

二、內(nèi)部類式單例類

復(fù)制代碼 代碼如下:

public class Singleton    
{       
        private Singleton(){    

    }    

    private class SingletonHoledr(){    
        private static Singleton instance = new Singleton();    
    }    

    private static Singleton getInstance(){    
        return SingletonHoledr.instance;    
    }    
}

特點:內(nèi)部類式中,實現(xiàn)了延遲加載,只有我們調(diào)用了getInstance(),才會創(chuàng)建唯一的實例到內(nèi)存中.并且也解決了懶漢式中多線程的問題.解決的方式是利用了Classloader的特性.

三、懶漢式單例類

復(fù)制代碼 代碼如下:

public class Singleton    
{       
    private Singleton(){    

    }    

    private static Singleton instance;    
    public static Singleton getInstance(){    
        if(instance == null){    
            return instance = new Singleton();    
        }else{    
            return instance;    
        }    
    }    
}  

特點:在懶漢式中,有線程A和B,當(dāng)線程A運行到第8行時,跳到線程B,當(dāng)B也運行到8行時,兩個線程的instance都為空,這樣就會生成兩個實例。解決的辦法是同步:

可以同步但是效率不高:

復(fù)制代碼 代碼如下:

public class Singleton    
{       
    private Singleton(){    

    }    

    private static Singleton instance;    
    public static synchronized Singleton getInstance(){    
        if(instance == null){    
            return instance = new Singleton();    
        }else{    
            return instance;    
        }    
    }    
}

這樣寫程序不會出錯,因為整個getInstance是一個整體的"critical section",但就是效率很不好,因為我們的目的其實只是在第一個初始化instance的時候需要locking(加鎖),而后面取用instance的時候,根本不需要線程同步。

于是聰明的人們想出了下面的做法:

雙檢鎖寫法:

復(fù)制代碼 代碼如下:

public class Singleton{ 
  private static Singleton single;    //聲明靜態(tài)的單例對象的變量 
  private Singleton(){}    //私有構(gòu)造方法  

  public static Singleton getSingle(){    //外部通過此方法可以獲取對象   
    if(single == null){    
        synchronized (Singleton.class) {   //保證了同一時間只能只能有一個對象訪問此同步塊       
            if(single == null){     
                single = new Singleton();         
        }    
      } 
    }   
    return single;   //返回創(chuàng)建好的對象  
  } 

思路很簡單,就是我們只需要同步(synchronize)初始化instance的那部分代碼從而使代碼既正確又很有效率。
這就是所謂的“雙檢鎖”機制(顧名思義)。
很可惜,這樣的寫法在很多平臺和優(yōu)化編譯器上是錯誤的。

原因在于:instance = new Singleton()這行代碼在不同編譯器上的行為是無法預(yù)知的。一個優(yōu)化編譯器可以合法地如下實現(xiàn)instance = new Singleton():

1. instance  = 給新的實體分配內(nèi)存

2. 調(diào)用Singleton的構(gòu)造函數(shù)來初始化instance的成員變量

現(xiàn)在想象一下有線程A和B在調(diào)用getInstance,線程A先進入,在執(zhí)行到步驟1的時候被踢出了cpu。然后線程B進入,B看到的是instance  已經(jīng)不是null了(內(nèi)存已經(jīng)分配),于是它開始放心地使用instance,但這個是錯誤的,因為在這一時刻,instance的成員變量還都是缺省值,A還沒有來得及執(zhí)行步驟2來完成instance的初始化。

當(dāng)然編譯器也可以這樣實現(xiàn):

1. temp = 分配內(nèi)存

2. 調(diào)用temp的構(gòu)造函數(shù)

3. instance = temp

如果編譯器的行為是這樣的話我們似乎就沒有問題了,但事實卻不是那么簡單,因為我們無法知道某個編譯器具體是怎么做的,因為在Java的memory model里對這個問題沒有定義。

雙檢鎖對于基礎(chǔ)類型(比如int)適用。很顯然吧,因為基礎(chǔ)類型沒有調(diào)用構(gòu)造函數(shù)這一步。

相關(guān)文章

  • Java枚舉詳解及使用實例(涵蓋了所有典型用法)

    Java枚舉詳解及使用實例(涵蓋了所有典型用法)

    這篇文章主要介紹了Java枚舉詳解及使用實例(涵蓋了所有典型用法),本文直接給出實例代碼,代碼中包含詳細注釋,需要的朋友可以參考下
    2015-05-05
  • IntelliJ IDEA 2019.1.1 for MAC 下載和注冊碼激活教程圖解

    IntelliJ IDEA 2019.1.1 for MAC 下載和注

    這篇文章主要介紹了IntelliJ IDEA 2019.1.1 for MAC 下載和注冊碼激活,教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • SpringBoot中的ApplicationListener事件監(jiān)聽器使用詳解

    SpringBoot中的ApplicationListener事件監(jiān)聽器使用詳解

    這篇文章主要介紹了SpringBoot中的ApplicationListener事件監(jiān)聽器使用詳解,ApplicationListener是應(yīng)用程序的事件監(jiān)聽器,繼承自java.util.EventListener標(biāo)準(zhǔn)接口,采用觀察者設(shè)計模式,需要的朋友可以參考下
    2023-11-11
  • 詳解Java中的JDK、JRE、JVM

    詳解Java中的JDK、JRE、JVM

    本文主要介紹了Java中的JDK、JRE、JVM的相關(guān)知識。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • 史上最全圖文講解Java泛型

    史上最全圖文講解Java泛型

    泛型在java中有很重要的地位,在面向?qū)ο缶幊碳案鞣N設(shè)計模式中有非常廣泛的應(yīng)用,下面這篇文章主要給大家介紹了Java泛型的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • Spring Boot如何優(yōu)化內(nèi)嵌的Tomcat示例詳解

    Spring Boot如何優(yōu)化內(nèi)嵌的Tomcat示例詳解

    spring boot默認web程序啟用tomcat內(nèi)嵌容器,監(jiān)聽8080端口,下面這篇文章主要給大家介紹了關(guān)于Spring Boot如何優(yōu)化內(nèi)嵌Tomcat的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-09-09
  • Java發(fā)送https請求并跳過ssl證書驗證方法

    Java發(fā)送https請求并跳過ssl證書驗證方法

    最近在負責(zé)一個對接第三方服務(wù)的事情,在對接期間因為第三方服務(wù)為https的請求,這篇文章主要給大家介紹了關(guān)于Java發(fā)送https請求并跳過ssl證書驗證的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • 老生常談java數(shù)組中的常見異常

    老生常談java數(shù)組中的常見異常

    數(shù)組是用來存儲一系列數(shù)據(jù),但它往往被認為是一系列相同類型的變量,異常是程序中的一些錯誤,但并不是所有的錯誤都是異常,并且錯誤有時候是可以避免的,接下來讓我們詳細的了解吧
    2022-03-03
  • Java進階教程之運行時類型識別RTTI機制

    Java進階教程之運行時類型識別RTTI機制

    這篇文章主要介紹了Java進階教程之運行時類型識別RTTI機制,在Java運行時,RTTI維護類的相關(guān)信息,比如多態(tài)(polymorphism)就是基于RTTI實現(xiàn)的,需要的朋友可以參考下
    2014-09-09
  • Java中的這些騷操作你不能不知道!!!

    Java中的這些騷操作你不能不知道!!!

    今天在看python相關(guān)的東西,看到各種騷操作,回頭想了下Java有沒有什么騷操作,整理下面幾種,一起看一下吧,希望能給你帶來幫助
    2021-07-07

最新評論

哈密市| 凭祥市| 清流县| 迁安市| 清涧县| 手机| 宁德市| 寻乌县| 汕头市| 车致| 云安县| 招远市| 甘谷县| 溆浦县| 胶南市| 汾西县| 多伦县| 广灵县| 固镇县| 浮山县| 江油市| 无极县| 池州市| 商都县| 大关县| 靖远县| 丽江市| 龙游县| 永德县| 南澳县| 汉中市| 准格尔旗| 壶关县| 蒲江县| 裕民县| 措勤县| 永靖县| 凤山县| 德州市| 佛冈县| 葵青区|