Java設計模式--單例模式

davidtim發表於2021-09-09

一、概念

  單例模式中物件建立只有一個單獨的例項,只有唯一的全域性訪問點。也可以說單例就是保證一個類只有一個例項。

二、實現方法

  單例模式的實現方法有很多,在這裡介紹幾種常用或者說常見的:

1、懶漢式

01

02

03

04

05

06

07

08

09

10

11

class LazySingleton{

    private static LazySingleton   singleton;

    private LazySingleton(){

    }

    public static LazySingleton   getInstance(){

        if(singleton==null){

            singleton=new   LazySingleton();

        }

        return singleton;

    }  

}

從程式碼中也可以看出,懶漢就是每次使用時才進行例項化,這也算是其一個優點, 而缺點也顯而易見,即其時執行緒不安全的,在多執行緒下不能正常工作。

2、餓漢式

1

2

3

4

5

6

7

class HungrySingleton{

    private static HungrySingleton   singleton=new HungrySingleton();

    private HungrySingleton(){}

    public static HungrySingleton   getInstance(){

        return singleton;

    }

}

餓漢式單例模式相比於懶漢式單例,在靜態初始化時完成單例物件的例項化。缺點在於不管是否使用這個單例,它都會一直在記憶體中,優點是其是執行緒安全的單例模式。

3、雙重校驗鎖單例模式

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

class LockSingleton{

    private volatile static LockSingleton   singleton;

    private LockSingleton(){}

      

    public static LockSingleton   getInstance(){

        if(singleton==null){

            synchronized(LockSingleton.class){

                if(singleton==null){

                    singleton=new   LockSingleton();

                }

            }

        }

        return singleton;

    }

}

雙重校驗鎖單例模式:每次外部請求單例物件時,先檢查是否已例項化,如果尚未例項化才進行例項化。理論上只有第一次才會徹底執行同步區塊內的程式碼,既實現了延遲載入,又是執行緒安全的單例模式

4、靜態內部類單例

1

2

3

4

5

6

7

8

9

class InternalSingleton{

    private static class SingletonHolder{

        private   final static  InternalSingleton INSTANCE=new InternalSingleton();

    }  

    private InternalSingleton(){}

    public static InternalSingleton   getInstance(){

        return SingletonHolder.INSTANCE;

    }

}

餓漢式單例雖然執行緒安全,但類裝載時建立物件會浪費記憶體而靜態內部類單例模式正好克服了這一點。因為其採用類級內部類(只有在第一次被使用的時候才會被裝載),類裝載的時候不初始化物件。使用JVM靜態初始化器進行初始化變數時,JVM會隱含為我們執行synchronized進行加互斥鎖的同步控制,從而同時實現延遲載入和執行緒安全

5、列舉實現單例

1

2

3

4

5

enum EnumSingleton{

    INSTANCE;

    public void doSomeThing(){

    }

}

優點是執行緒安全,呼叫效率高,天然防止反射和反序列化漏洞 。缺點就是不能實現延遲載入

 

原文連結:http://www.apkbus.com/blog-780485-77079.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3349/viewspace-2812490/,如需轉載,請註明出處,否則將追究法律責任。

相關文章