1. 程式人生 > 其它 >Java:多執行緒環境下的單例模式

Java:多執行緒環境下的單例模式

1、之前的程式碼:

public class Singleton_01 {
	
	//宣告靜態變數
	private static Singleton_01 s;
	
	//構造方法私有化,外部不能建立物件
	private Singleton_01(){
		
	}
	
	//在獲取物件時,先判斷物件是否被例項化
	//如果物件還沒有被建立,就建立
	//如果已經被例項化,則直接返回物件
	public static Singleton_01 getInstance(){
		if(s == null){
			s = new Singleton_01();
		}
		
		return s;
	}
	
}

在多執行緒環境下,上面的程式碼就不行了。因為多執行緒環境存在併發性和並行性 , 不同的執行緒有可能同時執行到這個方法,導致建立多個物件。

在這裡插入圖片描述
2、程式碼改進:

public class Singleton_01 {
	//靜態變數,儲存建立的物件
	private static Singleton_01 s;
	//私有化構造方法,外部不能隨意建立物件
	private Singleton_01() {

	}
	//對外提供一個獲取物件的方式
	public  static Singleton_01 getInstance() {
		if (s == null) {
			synchronized (Singleton_01.class) {
				if (s == null) {
					s = new Singleton_01();
				}
} } return s; } }

這樣的話,只有第一次請求需要排隊,後面就算有很多執行緒同時執行這個方法,也不會排隊等待,因為方法沒有加鎖,多個執行緒可以同時進來執行該方法。另外s已經在第一次請求的時候賦值過了,所以判斷s==null時,也是false,直接獲取s的值。