設計模式 單例模式

2021-09-08 16:34:14 字數 2647 閱讀 8193

保證乙個類只有乙個例項,並且提供乙個訪問該例項的全域性訪問點。

– 主要:

• 餓漢式(執行緒安全,呼叫效率高。 但是,不能延時載入。)

• 懶漢式(執行緒安全,呼叫效率不高。 但是,可以延時載入。)

– 其他:

• 雙重檢測鎖式(由於jvm底層內部模型原因,偶爾會出問題。不建議使用)

• 靜態內部類式(執行緒安全,呼叫效率高。 但是,可以延時載入)

• 列舉單例(執行緒安全,呼叫效率高,不能延時載入)

/**

* 餓漢式實現(單例物件立即載入)

* @author fts

* */

public class singletondemo02 //私有化構造器

//不需要使用synchronized進行同步,

//使用private static /*final*/ singletondemo02 single = new singletondemo02();

//這種形式在類載入的時候就載入了,是一種天然的執行緒安全模式

//方法沒有同步,呼叫效率高

private static singletondemo02 getinstance()

/** 測試

*/public static void main(string args)

}

• 餓漢式單例模式**中,static變數會在類裝載時初始化,此時也不會涉及多個執行緒物件訪問該物件的問題。虛擬機器保證只會裝載一次該類,肯定不會發生併發訪問的問題。因此,可以省略synchronized關鍵字。

• 問題:如果只是載入本類,而不是要呼叫getinstance(),甚至永遠沒有呼叫,則會造成資源浪費!

/**

* 懶漢式實現(單例物件延時載入)

* @author fts

* */

public class singletondemo01 ;//私有化構造器

//方法同步,呼叫效率低

public static synchronized singletondemo01 getinstance()

return single01;

}}

• 要點:

– lazy load! 延遲載入, 懶載入! 真正用的時候才載入!

• 問題:

– 資源利用率高了。但是,每次呼叫getinstance()方法都要同步,併發效率較低。

/**

* 雙重檢測鎖實現

* @author fts

* */

public class singletondemo03

} instance = sc;

} }} return instance;

} private singletondemo03()

}

• 這個模式將同步內容下方到if內部,提高了執行的效率不必每次獲取物件時行同步,只有第一次才同步建立了以後就沒必要了。

• 問題:

• 由於編譯器優化原因和jvm底層內部模型原因,偶爾會出問題。不建議用。

/**

* 靜態內部類實現方式(也是一種懶載入方式)

* @author fts

* */

public class singletondemo04

public static singletondemo04 getinstance()

private singletondemo04()

}

• 要點:

– 外部類沒有static屬性,則不會像餓漢式那樣立即載入物件。

– 只有真正呼叫getinstance(),才會載入靜態內部類。載入類時是執行緒 安全的。 instance是static final

型別,保證了記憶體中只有這樣乙個例項存在,而且只能被賦值一次,從而保證了執行緒安全性.

– 兼備了併發高效呼叫和延遲載入的優勢!

/**

* 使用枚實現單例模式

* @author fts

* */

public enum singletondemo05

/*** 測試

* @param args

*/public static void main(string args)

}

• 優點:

– 實現簡單

– 列舉本身就是單例模式。由jvm從根本上提供保障!避免通過反射和反序列化的漏洞!

• 缺點:

– 無延遲載入

– 主要:

• 餓漢式(執行緒安全,呼叫效率高。 但是,不能延時載入。)

• 懶漢式(執行緒安全,呼叫效率不高。 但是,可以延時載入。)

– 其他:

• 雙重檢測鎖式(由於jvm底層內部模型原因,偶爾會出問題。不建議使用)

• 靜態內部類式(執行緒安全,呼叫效率高。 但是,可以延時載入)

• 列舉式(執行緒安全,呼叫效率高,不能延時載入。並且可以天然的防止反射和反序列

化漏洞!)

– 單例物件 占用 資源 少,不需要 延時載入:

• 列舉式 好於 餓漢式

– 單例物件 占用 資源 大,需要 延時載入:

• 靜態內部類式 好於 懶漢式

設計模式 單例模式

單例模式 singleton pattern 是乙個比較簡單的模式,其定義如下 ensure a class has only one instance,and provide a golbal point of acess to it.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...

設計模式 單例模式

class testsingleton static public function instance return self testsingleton private function clone public function setsinvar sinvar public function ...

設計模式 單例模式

單例模式的目的是保證類在系統中只被例項化一次,由該唯一的例項來為系統提供服務.單例模式主要用於保證服務的統一,比如獲取統一的編號服務,模仿oracle的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...