java 單例模式與線程安全性問題

餓漢式

餓漢式就是在變量申明的時候就完成初始化工作

優點:沒有線程安全性問題

缺點:在程序加載時,單例模式的實體就已經被創建了,存在性能問題

public class Singleton {
	
	// 私有化構造方法
	private Singleton () {}

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

懶漢式

懶漢式就是在變量需要使用的時候調用初始化函數進行構造

package com.roocon.thread.t5;

public class Singleton2 {
	
	private Singleton2() {}
	
	private static volatile Singleton2 instance;
	
	/**
	 * 雙重檢查加鎖
	 * 
	 * @return
	 */
	public static Singleton2 getInstance () {
		// 考慮到程序性能,不能直接在方法中加synchronized,應該加在方法塊上
		if(instance == null) {
			synchronized (Singleton2.class) {
				if(instance == null) {
					instance = new Singleton2();  // 指令重排序	
					// 申請一塊內存空間   // 1
					// 在這塊空間裏實例化對象  // 2
					// instance的引用指向這塊空間地址   // 3
				}
			}
		}
		return instance;
	}
}

發佈了51 篇原創文章 · 獲贊 23 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章