設計模式--單例模式,高併發下線程安全的單例模式

[置頂] 高併發下線程安全的單例模式(最全最經典)

http://blog.csdn.net/cselmu9/article/details/51366946java

單例模式安全

功能:保證類在運行期間只會被建立一個類實例。

單例模式是對象的建立模式之一,此外還包括工廠模式。單例模式有以下幾個特色:併發

1:該類只有一個實例。函數

2:該類自行建立該實例,在該類內部建立自身的實例對象。高併發

3:向整個系統公開這個實例接口。性能

例以下面代碼演示:

package com.wbx.design;

import test.C;

public class Singleton {
	//私有,靜態的類自身實例
	private static Singleton instance = new Singleton(); 
	//私有構造函數
	private Singleton(){  //2:構造函數
		System.out.println("aaaaaaaaa");
	}
	//公開,靜態的工廠方法
	public static Singleton getInstance(){  //3
		System.out.println("bbbb");
		return instance;
	}
	C c = new C(); //1:屬性類的構造函數
}

上面代碼片斷中引入建立對象C,爲了看看類中代碼的執行順序測試

測試單例模式在內存中只有一個實例

public static void main(String[] args) {
		Singleton s1 = getInstance();
		Singleton s2 = getInstance();
		Singleton s3 = getInstance();
		System.out.println("s1=="+s1);
		System.out.println("s2=="+s2);
		System.out.println("s3=="+s3);
		
		
		C c1 = new C(); //1:屬性類的構造函數
		C c2 = new C(); //1:屬性類的構造函數
		C c3 = new C(); //1:屬性類的構造函數
		System.out.println("c1=="+c1);
		System.out.println("c2=="+c2);
		System.out.println("c3=="+c3);
	}

測試結果優化

ccccccccccc
aaaaaaaaa
bbbb
bbbb
bbbb
s1==com.wbx.design.Singleton@2f581b9f
s2==com.wbx.design.Singleton@2f581b9f
s3==com.wbx.design.Singleton@2f581b9f
ccccccccccc
ccccccccccc
ccccccccccc
c1==test.C@417d7c01
c2==test.C@1558473e
c3==test.C@56ad4264

單例模式的優勢和缺點

1:優勢spa

a:減小內存消耗,特別是一個對象若是頻繁地建立、銷燬,並且建立或銷燬時性能沒法優化,這時採用單例模式的優點就很是明顯。.net

b:當一個對象產生須要比較多的資源時,如讀取配置、產生其餘對象時,則能夠經過在應用啓動時直接產生一個對象,而後永久駐留內存的方式來解決(在Java EE中採用單例模式時須要注意JVM垃圾回收機制);

c:單例模式能夠在系統中設置全局的訪問點,優化共享資源的訪問,例如能夠設計一個單例類,負責全部數據表的映射處理。

2:缺點

a:單例模式沒有接口,擴展很困難,接口對單例模式是沒有任何意義,它要求「自行實例化」,而且提供單一實例、接口或抽象類是不可能被實例話的。

b:單例模式與單一職責原則有衝突。一個類應該只實現一個的邏輯,而不關係它是不是單例的,決定它是否是要單例是環境決定的,單例模式把「要單例」和業務邏輯融合在一個類中。

相關文章
相關標籤/搜索