最代碼廣告位
偷顆菜抱回家的gravatar頭像
偷顆菜抱回家2016-12-16 10:31:43

java實現兩種常用的線程安全的單例模式

單例模式經常會使用,但是在多線程環境下,不規范的單例寫法還是會出現單例對象并非單例。這里分享兩個常用的線程安全的單例模式,當然還有其他實現線程安全的單例。

1、雙層檢測

public class Instance implements Serializable {
	/** 
	 * @since JDK 1.7 
	 */ 
	private static final long serialVersionUID = -4827759752671402638L;
	private volatile static Instance instance = null;
	private Instance(){}
	//雙層檢測,在1.5以后Instance對象開始提供volatile關鍵字修飾變量來達到穩定效果
	public static Instance getInstance(){
		if(instance == null){
			//注意是synchronized 字節碼,不是synchronized 對象
			synchronized(Instance.class){
				if(instance == null){
					instance = new Instance();
				}
			}
		}
		return instance;
	}
	
	@Override
	public String toString() {
		return "DCL檢測";
	}
	
	/**
    * 因實現Serializable接口。反序列化單例需要 ,在反序列化時會被調用,若不加此方法 則反序列化的類不是單例的
    */
	private Object readResolve() throws ObjectStreamException {
		return getInstance();
    }
	
}

 

2、靜態內部類

public class Instance2 implements Serializable {
	/** 
	 * @since JDK 1.7 
	 */ 
	private static final long serialVersionUID = 6921443757360064842L;

	private Instance2(){}
	//靜態內部類
	private static class Instance2Holder{
		private static Instance2 instance = new Instance2();
	}
	
	public static Instance2 getInstance(){
		return Instance2Holder.instance;
	}
	
	@Override
	public String toString() {
		return "靜態內部類";
	}
	
	/**
    * 因實現Serializable接口。反序列化單例需要 ,在反序列化時會被調用,若不加此方法 則反序列化的類不是單例的
    */
	private Object readResolve() throws ObjectStreamException {
		return getInstance();
    }
}

 

運行截圖:

java實現兩種常用的線程安全的單例模式

java實現兩種常用的線程安全的單例模式


打賞

頂部客服微信二維碼底部
>掃描二維碼關注最代碼為好友掃描二維碼關注最代碼為好友
黑龙江11选5实时走势图