1. 程式人生 > >單例餓漢式和飽漢式各自的有缺點

單例餓漢式和飽漢式各自的有缺點

單例模式應用於一個類只有一個例項的情況,並且為其例項提供一個全域性的訪問點。

特點

1.一個類只有一個例項

2.自己建立這個例項

3.整個系統只能用這個例項

應用場景

外部資源:每臺計算機有若干個印表機,但只能有一個PrinterSpooler,以避免兩個列印作業同時輸出到印表機。

內部資源:大多數軟體都有一個(或多個)屬性檔案存放系統配置,這樣的系統應該有一個物件管理這些屬性檔案。

實現方式

1.餓漢式:單例例項在類裝載時就構建,急切初始化。(預先載入法)

/**
 * 餓漢式(推薦)
 *
 */
public class Singleton1 {

	private Singleton1() {
	}

	public
static Singleton1 instance = new Singleton1(); public Singleton1 getInstance() { return instance; } }

優點 1.執行緒安全 
2.在類載入的同時已經建立好一個靜態物件,呼叫時反應速度快
缺點 資源效率不高,可能getInstance()永遠不會執行到,但執行該類的其他靜態方法或者載入了該類(class.forName),那麼這個例項仍然初始化

2.懶漢式:單例例項在第一次被使用時構建,延遲初始化。

class Singleton2 {
	private Singleton2() {
	}

	public
static Singleton2 instance = null; public static Singleton2 getInstance() { if (instance == null) {
              //多個執行緒判斷instance都為null時,在執行new操作時多執行緒會出現重複情況
			instance = new Singleton2();
		}
		return instance;
	}
}

懶漢式在單個執行緒中沒有問題,但在多執行緒就可能會出現兩個或多個Singleton2例項情況,

雖然後面例項化的Singleton2會覆蓋前面例項化的Singleton2,但最好避免這樣的情況。

改進方式就是加鎖synchornized

class Singleton3 {
	private Singleton3() {
	}

	public static Singleton3 instance = null;

	public static synchronized Singleton3 getInstance() {
		if (instance == null) {
			instance = new Singleton3();
		}
		return instance;
	}
}
優點 資源利用率高,不執行getInstance()就不會被例項,可以執行該類的其他靜態方法
缺點 第一次載入時不夠快,多執行緒使用不必要的同步開銷大


3.雙重檢測

class Singleton4 {
	private Singleton4() {
	}

	public static Singleton4 instance = null;

	public static Singleton4 getInstance() {
		if (instance == null) {
			synchronized (Singleton4.class) {
				if (instance == null) {
					instance = new Singleton4();
				}
			}
		}
		return instance;
	}
}

優點 資源利用率高,不執行getInstance()就不被例項,可以執行該類其他靜態方法
缺點 第一次載入時反應不快,由於java記憶體模型一些原因偶爾失敗

4.靜態內部類

class Singleton5 {
	private Singleton5() {
	}

	private static class SingletonHelp {
		static Singleton5 instance = new Singleton5();
	}

	public static Singleton5 getInstance() {
		return SingletonHelp.instance;
	}
}

優點 資源利用率高,不執行getInstance()不被例項,可以執行該類其他靜態方法
缺點 第一次載入時反應不夠快

總結:一般採用餓漢式(1),若對資源十分在意可以採用靜態內部類(4),不建議採用懶漢式及雙重檢測(2、3)

相關推薦

從零開始學Java之模式:懶漢模式模式

單例模式:單例模式是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統中一個類只有一個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。

各自缺點

單例模式應用於一個類只有一個例項的情況,並且為其例項提供一個全域性的訪問點。 特點: 1.一個類只有一個例項 2.自己建立這個例項 3.整個系統只能用這個例項 應用場景 外部資源:每臺計算機有若干個印表機,但只能有一個PrinterSpooler,以避免兩個列

JAVA中的模式及jdk中Runtime類的模式實現方式詳解

一、描述 單例模式是一種非常常見的設計模式,即一個類只能有一個物件(例項),一般通過將該類的構造器私有化,來阻止在該類外建立該類的物件,並提供給外界一個唯一的物件(這個物件在該類中建立)。        java中的單例模式常見的有兩種實現方式,一種是惡漢方式,即將該類物件

模式模式

單例中飽漢/懶漢和餓漢的本質區別在於以下幾點:  1、餓漢式是執行緒安全的,在類建立的同時就已經建立好一個靜態的物件供系統使用,以後不在改變。懶漢式如果在建立例項物件時不加上synchronized則會導致對物件的訪問不是執行緒安全的。  2、從實現方式來講他們最大的區別就

設計模式之 模式(懶漢式

設計模式: 一些人總結出來用來解決特定問題的固定的解決方案。 單例模式 解決一個類在記憶體中只存在一個物件,想要保證物件的唯一。 1 為了避免其他程式過多的建立該類物件。禁止其他程式建立該類物件。 2 為了其他程式可以訪問該類物件,在本類中自定義一個物件。 3 方便其他程

模式(懶漢式)及如何實現執行緒安全

單例模式有兩種:懶漢式和餓漢式。 1 #include <iostream> 2 3 using namespace std; 4 5 6 // 保證在整個程式執行期間,最多隻能有一個物件例項 7 8 9 // 懶漢式 10 // 1 、建構函式私有化 11

模式(懶漢式

單例模式是一個類有且僅有一個例項,並且自行例項化向整個系統提供,常用的有懶漢式和餓漢式。 一、懶漢式:在第一次呼叫的時候才例項化自己。 public class Singleton {

Java模式中的

Java中單例模式是筆試的常見題目,包括飽漢式和飢漢式,具體程式碼實現如下:飽漢式:public class SingleTon { private SingleTon(){} priv

如何正確地寫出模式(懶漢式寫法)

本文轉自大神:伍翀 原文連結 單例模式算是設計模式中最容易理解,也是最容易手寫程式碼的模式了吧。但是其中的坑卻不少,所以也常作為面試題來考。本文主要對幾種單例寫法的整理,並分析其優缺點。很多都是一些老生常談的問題,但如果你不知道如何建立一個執行緒安全的單例,不知道什

設計模式之模式(懶漢式

設計模式第一個模式通常是單例模式,是為了防止某個類存在多個物件。 程式碼如下: **singlon.h:** #pragma once #ifndef _SINGLON_H #define _SINGLON_H class singlon { publ

java模式,懶漢式的區別,雙層鎖

單例就是該類只能返回一個例項。 單例所具備的特點: 1.私有化的建構函式 2.私有的靜態的全域性變數 3.公有的靜態的方法 一般常見到的是3種: 餓漢式(執行緒不安全): public class Singleton1 {       private Singleton

如何編寫模型?(模式)

package cn.kgc.tools; import java.io.IOException; import java.io.InputStream; import java.util.Properties; //讀取配置檔案的工具類-單例模式 public clas

模式(懶漢式區別)

單例模式 所謂單例模式,就是保證類在記憶體中只有一個物件 而如何保證類在記憶體中只有一個物件? 思考一下,我們平時在例項化類的物件時,基本都是通過new 的方式來例項化一個物件,其實說白了,就是呼叫了需要例項化類的預設的構造方法,所以為了保證類只有一個物件,我們需要將類

android之模式:懶漢式的區別

單例模式:懶漢式和餓漢式    餓漢式:執行緒安全:構造方法私有化:推薦使用          public class Singleton{            private static Si

模式之懶漢式

mce private 靜態工廠方法 pri return let class 懶漢 single //懶漢式public class Singleton { private Singleton() { } private static Singleton

java懶漢模式

面試時,經常會問到單例模式。 單例模式的兩種方式: 一種是餓漢式,就是在類初始化的時候,建立物件,這種方式是執行緒安全的,在程式執行期間就這一個物件。 另一種是懶漢式,懶漢式是在第一次使用時才建立物件,但是如果在多執行緒環境中要考慮執行緒安全問題。 比較喜歡的方

Java 懶漢式

轉載請註明出處:http://blog.csdn.net/mr_liabill/article/details/48374921   來自《LiaBin的部落格》 單例模式很常見,在面試中也會經常直接讓你寫一個單例出來 單例模式寫法一般分為兩種,懶漢式和餓漢式 餓漢式

設計模式:模式-懶漢模型模型

什麼是單例模式? 保證一個類只有一個例項,並提供一個訪問它的全域性訪問點。首先,需要保證一個類只有一個例項;在類中,要構造一個例項,就必須呼叫類的建構函式,如此,為了防止在外部呼叫類的建構函式而構造例項,需要將建構函式的訪問許可權標記為protected或pr

Java面試題之在多線程情況下,模式中懶漢什麽問題呢?

餓漢模式 問題 之間 static 代碼 clas ava public 餓漢 懶漢模式和餓漢模式: public class Demo { //private static Single single = new Single();//餓漢模式

模式中final關鍵字的作用

原文: http://www.tuicool.com/articles/2Yjmqy 併發程式設計網:http://ifeve.com/java-memory-model/ 總結: Final 變數在併發當中,原理是通過禁止cpu的指令集重排序(重排序詳解http://ifeve.com/java-mem