單例模式幾種安全的實現

2022-09-17 09:12:12 字數 1774 閱讀 4549

單例的應用場景:

需要頻繁的建立和銷毀物件的、建立物件時耗時過多或者消耗資源過多但是又經常用到的物件、工具類物件或資料庫或檔案的物件。

當物件含有可改變的狀態時(更精確的說就是在實際應用中該狀態會改變),則用多例。

一、懶漢式,執行緒安全的實現

public

static

synchronized

singleton getinstance()

return

instance;

}

這雖然是執行緒安全的,但是效率低。還有一些比較常犯的錯誤,不加同步限制的,不做舉例。

二、餓漢式,執行緒安全

1.構造器私有化

2.類的內部建立物件

3.像外部暴露乙個靜態的公共方法。getinstance

優點:在類裝載的時候就完成了例項化。避免了執行緒同步問題。

缺點:沒有達到lazy loading(懶載入)的效果,如果從來沒使用過這個類,就會造成記憶體的浪費。

public class singleton

public static singleton getinstance()

}但是要是明確要求是需要懶載入的,這個就不行的

第二種寫法,在類的靜態**塊中建立例項:

public

class

singleton

//2.在本類的內部建立物件例項

private

static

singleton instance;

static

//3.提供靜態方法,返回例項物件

public

static

singleton getinstance()

}

三、靜態內部類

我比較傾向於使用靜態內部類的方法,這種方法也是《effective j**a》上所推薦的。

public class singleton   

private singleton (){}

public static final singleton getinstance()

}

四、列舉

用列舉寫單例實在太簡單了!這也是它最大的優點。下面這段**就是宣告列舉例項的通常做法。

public enum easysingleton

建立enum時,編譯器會自動為我們生成乙個繼承自j**a.lang.enum的類,我們上面的enum可以簡單看作:

class type extends

enum

demo:

public

enum

singleenum ;

public

string getstrings()

}

五、雙重檢測

//

雙重檢查

public

class

singleton

public

static

singleton getinstance() }}

return

instance;

}}

這個**只在第一次,兩個執行緒不能同時執行synchronized方法,但是,後面install不為空後,instance == null就直接pass掉了。volatile的作用理解是instance = new singleton立即到記憶體中生效。

單例模式幾種實現

1.單執行緒模式下,推薦懶載入 public class singleton1 public static singleton1 getinstance return singleton 2.上述1演示,執行緒不安全,最容易想到的變為執行緒安全的方式就是加關鍵字synchronized public...

單例模式的幾種實現

首先說明 singleton 是乙個單詞,不是乙個複合詞。接下來步入正題。對於單例模式無論是 餓漢 還是 懶漢 都必須要有的是 一.私有建構函式 二.宣告靜態單例物件 如果是 懶漢 的話為了寫出好的沒有 bug的單例 還應注意 三.構造單例物件之前要加鎖 lock乙個靜態的object物件 四.需要...

單例模式的幾種實現

1 餓漢式 執行緒安全,呼叫效率高,但是不能延時載入 public class imageloader public static imageloader getinstance 一上來就把單例物件建立出來了,要用的時候直接返回即可,這種可以說是單例模式中最簡單的一種實現方式。但是問題也比較明顯。單...