5 單例模式

單例模式結(jié)構(gòu)

單線(xiàn)程

// Singleton.java
public class Singleton {
    private static Singleton instance;

    private Singleton() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
// Demo.java
public class Demo {
    public static void main(String[] args) {
        Singleton singleton = Singleton.getInstance();
        Singleton singleton1 = Singleton.getInstance();
        System.out.println(singleton == singleton1);
    }
}

多線(xiàn)程問(wèn)題(返回結(jié)構(gòu)不一致)

// Singleton.java
public class Singleton {
    private static Singleton instance;
    public String value;

    private Singleton(String value) {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        this.value = value;
    }

    public static Singleton getInstance(String value) {
        if (instance == null) {
            instance = new Singleton(value);
        }
        return instance;
    }
}
// Demo.java
public class Demo {
    public static void main(String[] args) {
        Thread threadFoo = new Thread(new ThreadFoo());
        Thread threadBar = new Thread(new ThreadBar());
        threadFoo.start();
        threadBar.start();
    }

    static class ThreadFoo implements Runnable {
        @Override
        public void run() {
            Singleton singleton = Singleton.getInstance("Foo");
            System.out.println(singleton.value);
        }
    }

    static class ThreadBar implements Runnable {
        @Override
        public void run() {
            Singleton singleton = Singleton.getInstance("Bar");
            System.out.println(singleton.value);
        }
    }
}

多線(xiàn)程解決方法(采用延遲加載的線(xiàn)程安全單例)

// Singleton.java
public class Singleton {
    // volatile保證雙端檢鎖正確工作
    private static volatile Singleton instance;
    public String value;

    private Singleton(String value) {
        this.value = value;
    }

    public static Singleton getInstance(String value) {
        Singleton result = null;
        if (result != null) {
            return result;
        }
        synchronized (Singleton.class) {
            if (instance == null) {
                instance = new Singleton(value);
            }
            return instance;
        }
    }
}
// Demo.java
public class Demo {
    public static void main(String[] args) {
        Thread threadFoo = new Thread(new ThreadFoo());
        Thread threadBar = new Thread(new ThreadBar());
        threadFoo.start();
        threadBar.start();
    }

    static class ThreadFoo implements Runnable {
        @Override
        public void run() {
            Singleton singleton = Singleton.getInstance("Foo");
            System.out.println(singleton.value);
        }
    }

    static class ThreadBar implements Runnable {
        @Override
        public void run() {
            Singleton singleton = Singleton.getInstance("Bar");
            System.out.println(singleton.value);
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 定義: 保證一個(gè)類(lèi)僅有一個(gè)實(shí)例, 并提供一個(gè)全局訪(fǎng)問(wèn)點(diǎn) 類(lèi)型: 創(chuàng)建型 使用場(chǎng)景 確保任何情況下都絕對(duì)只有一個(gè)實(shí)例...
    a_salt_fish閱讀 461評(píng)論 0 6
  • 開(kāi)發(fā)中對(duì)于某些對(duì)象,我們只需要一個(gè)唯一的對(duì)象,否則會(huì)導(dǎo)致很多問(wèn)題,可能會(huì)導(dǎo)致運(yùn)行異常、資源浪費(fèi)、不一致等問(wèn)題。如:...
    bit_拳傾天下閱讀 236評(píng)論 0 0
  • 1. 簡(jiǎn)介 ??單例模式確保某一個(gè)類(lèi)只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例,這個(gè)類(lèi)稱(chēng)為單例類(lèi),它提供...
    火山_6c7b閱讀 262評(píng)論 1 1
  • 單例模式(Singleton Pattern)確保一個(gè)類(lèi)只有一個(gè)實(shí)例,并且提供一個(gè)全局的訪(fǎng)問(wèn)。 單例模式隨處可見(jiàn),...
    Carltony閱讀 513評(píng)論 0 2
  • 前言 本文主要參考 那些年,我們一起寫(xiě)過(guò)的“單例模式”。 何為單例模式? 顧名思義,單例模式就是保證一個(gè)類(lèi)僅有一個(gè)...
    tandeneck閱讀 2,628評(píng)論 1 8

友情鏈接更多精彩內(nèi)容