溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

java怎么實(shí)現(xiàn)單例模式

發(fā)布時(shí)間:2021-09-04 16:12:08 來(lái)源:億速云 閱讀:111 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要講解了“java怎么實(shí)現(xiàn)單例模式”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“java怎么實(shí)現(xiàn)單例模式”吧!

要點(diǎn)

  1. 某個(gè)類只能有一個(gè)實(shí)例

    • 構(gòu)造器私有化

  2. 它必須自行創(chuàng)建這個(gè)實(shí)例

    • 含有一個(gè)該類的靜態(tài)變量來(lái)保存這個(gè)唯一實(shí)例

  3. 必須自行先整個(gè)系統(tǒng)提供這個(gè)實(shí)例

    • 對(duì)外提供獲取該實(shí)例對(duì)象的方式

    1. 直接暴露

    2. 用靜態(tài)變量的 get 方法獲取

常見幾種形式

  • 餓漢式:直接創(chuàng)建對(duì)象不存在線程安全問(wèn)題

    • 直接實(shí)例化餓漢式(簡(jiǎn)潔直觀)

    • 枚舉式(最簡(jiǎn)潔)

    • 靜態(tài)代碼塊餓漢式(適合復(fù)雜實(shí)例化)

  • 懶漢式:延遲創(chuàng)建對(duì)象

    • 線程不安全(適用于單線程)

    • 線程安全(適用于多線程)

    • 靜態(tài)內(nèi)部列形式(適用于多線程)

  1. 直接實(shí)例化對(duì)象,不管是否需要這個(gè)對(duì)象-餓漢式

/*
* 餓漢式
*(1)構(gòu)造器私有化
*(2)自行創(chuàng)建,并用靜態(tài)變量保存
*(3)向外提供這個(gè)實(shí)例
*(4)強(qiáng)調(diào)這是單例,用final修飾(這個(gè)變量只能賦值一次,之后不能修改)
*/
public class Singleton1 {
    public static final Singleton1 INSTANCE = new Singleton1();
    private Singleton1 (){
        
    }
}
  1. 枚舉-jdk1.5之后-餓漢式

/*
*餓漢式
*枚舉類型:表示該類型的對(duì)象是有限的幾個(gè)
*我們可以限定為一個(gè),就成了單例
*/
public enum Singleton2{
    INSTANCE
}
  1. 靜態(tài)代碼塊-餓漢式

/*
* 這種方式,適合那種需要從配置文件里面讀一堆信息來(lái)實(shí)例化。
*/
public class Singleton3 {
    public static final Singleton3 INSTANCE;
    private String info;
    static {
        try {
            Properties pro = new Properties(); // 從位于src目錄下的配置文件single.properties中讀取信息
            pro.load(Sinfleton3.class.getClassLoader().getResourceAsStream("single.properties"));
            INSTANCE = new Singleton3(pro.getPropertied("info"));
        }catch(IOExcepption e){
            throw new RuntimeException(e);
        }
    }
    private Singleton3 (String info){
        this.info = info;
    }
}

4.線程不安全(適合單線程)-懶漢式

/*
* 懶漢式
*(1)構(gòu)造器私有化
*(2)靜態(tài)變量保存
*(3)提供一個(gè)靜態(tài)方法,獲取實(shí)例對(duì)象
*/
public class Singleton4 {
    private static Singleton4 instance;
    private Singleton4 (){
        
    }
    public static Singleton4 getInstance(){
        if(instance == null){
            //加上Thread.sleep(100);多線程情況下 會(huì)實(shí)例化兩個(gè)對(duì)象。
            instance = new Singleton4();
        }
        return instance;
    }
}
  1. 線程安全(適合多線程)-懶漢式

/*
* 懶漢式
*(1)構(gòu)造器私有化
*(2)靜態(tài)變量保存
*(3)提供一個(gè)靜態(tài)方法,獲取實(shí)例對(duì)象
*/
public class Singleton5 {
    private static Singleton5 instance;
    private Singleton5 (){
        
    }
    public static Singleton5 getInstance(){
        if(instance == null){//先判斷是否為空,再進(jìn)行加鎖。
            synchronized(Singleton5.class){
                //加上Thread.sleep(100);多線程情況下 會(huì)實(shí)例化兩個(gè)對(duì)象。
                instance = new Singleton5();
            }
        }
        return instance;
    }
}
  1. 靜態(tài)內(nèi)部類形式

/*
* 再內(nèi)部類被加載和初始化時(shí),才創(chuàng)建INSTANCE實(shí)例對(duì)象
* 靜態(tài)內(nèi)部類不會(huì)自動(dòng)隨著外部類的加載和初始化而初始化,它是要單獨(dú)去加載和初始化的
* 因?yàn)槭窃趦?nèi)部類加載和初始化是,創(chuàng)建的,因此是線程安全的。
*/
public class Singleton6 {
    
    private Singleton6 (){
        
    }
    private static class Inner{
        private static final Singleton6 INSTANCE = new Singleton6();
    }
    public static Singleton6 getInstance(){
        return Inner.INSTANCE;
    }
}

感謝各位的閱讀,以上就是“java怎么實(shí)現(xiàn)單例模式”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)java怎么實(shí)現(xiàn)單例模式這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI