Java:多執行緒環境下的單例模式
阿新 • • 發佈:2021-02-01
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的值。