設計模式——單件模式

爲何使用單件模式?java

有一些對象咱們只須要一個,比方說:線程池、緩存等等,若是同時實例化了多個對象反而會出現一些問題。程序員

對於這種類,僅靠程序員憑照約定不實例化,顯然是不可靠的。 緩存

 

嘗試:建立一個類,把全部的方法和變量都設置成靜態的,把類直接當作一個單件使用。安全

問題:由於靜態初始化的控制權是在java手上,這麼作可能致使混亂,特別是當有許多類牽涉其中的時候。多線程

 

嘗試:使用全局變量代替單件模式。函數

問題:在Java中,全局變量基本上就是對對象的靜態引用。缺點一,急切實例化VS延遲實例化。缺點二,不能確保只有一個實例。性能

什麼是單件模式?spa

定義:確保一個類只有一個實例,並提供一個全局訪問點。線程

 

怎麼用單件模式?code

將構造器設置爲private,即只有類自己才能調用本身的構造函數;

爲類設置一個靜態方法getInstance()來建立或獲取這個實例。

處理多線程:

方法一:同步getInstance()方法,直接給該方法添加synchronize關鍵字便可

適用狀況:getInstance()方法不被頻繁運行,或性能不是很關鍵。

方法二:急切實例化,即在靜態初始化器中建立單件,可以保證線程安全

public class Singleton{
    private static Singleton uniqueInstance=new Singleton();
    private Singleton(){}
    
    public static Singleton getInstance(){
        return uniqueInstance;
    }
)

適用狀況:應用老是建立單件,適用單件很頻繁

方法三:雙重檢查加鎖

public class Singleton{
    private volatile static Singleton uniqueInstance;//必須有volatile關鍵字,確保初始化成實例時,多個線程正確地處理該變量
    private Singleton(){}
    
    public static Singleton getInstance(){
        if(uniqueInstance==null){
            synchronized(Singleton.class){
                if(uniqueInstance==null){
                     uniqueInstance=new Singleton();
                }
             }
        }
        return uniqueInstance;
    }
)

適用變量:java5之後可使用,性能很好。

相關文章
相關標籤/搜索