單例模式的幾種實現

2021-10-09 22:42:55 字數 1385 閱讀 9675

單例模式,是設計模式之一,目的是為了只提供乙個物件,單例模式的實現,一般需要滿足:

(1)構造器私有

(2)提供乙個共有的外界訪問例項的方法

以下提供單例模式的幾種實現方式:

// 單例:餓漢式

public class eagersingleton ;

// 獲取例項的公共方法

public static eagersingleton geteagersingleton()

}

餓漢式,通過類載入單執行緒的特點,在類初始化就例項化了乙個物件:

private static eagersingleton eagersingleton = new eagersingleton();
但是,如果系統中存在大量的餓漢式單例,而且系統又不一定用得上,那麼,就會造成資源的浪費。

// 單例:靜態內部類實現

public class staticsingleton ;

// 通過靜態內部類返回例項物件

public static staticsingleton getstaticsingleton()

// 靜態內部類在類載入階段,例項化物件

public static class instanceclass

}

這種方式,是如何確保單例的呢?首先,在沒有呼叫getstaticsingleton()方法獲取例項之前,靜態內部類不會初始化,只有在呼叫該方法時,才會載入靜態內部類,然後例項化物件,從而確保了物件是單例的,這種方式和餓漢式的原理是一樣的,不過多了一層,同時實現了懶載入,避免了餓漢式的缺點。

懶漢式實現,一般採用雙重檢驗鎖的方式實現:

// 單例:懶漢式,雙重檢驗鎖

public class lazysingleton ;

public static lazysingleton getlazysingleton()}}

return lazysingleton;

}}

這裡,你或許會問,為什麼需要做兩次判斷呢?

假設有2個執行緒,執行緒1和執行緒2同時到達第一次判斷的位置:

// 第一重判斷

if (lazysingleton == null)

由於一開始,並沒有例項化物件,所以執行緒1和執行緒2都會進入到**塊執行,假設是執行緒1拿到了鎖,那麼執行緒2就只能等待,直到執行緒1建立完物件釋放鎖,加入沒有第二次判斷,那麼執行緒2也會建立物件,那麼就不是單例了。

// 單例:列舉

public enum enumsingleton

這種應該是最簡單的了,至於列舉為什麼能實現單例,請參考:

單例模式幾種實現

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 一上來就把單例物件建立出來了,要用的時候直接返回即可,這種可以說是單例模式中最簡單的一種實現方式。但是問題也比較明顯。單...