單例模式中的執行緒安全問題

2021-10-14 07:17:25 字數 1253 閱讀 9946

public class singleton ;  

public static singleton getinstance()

return instance;

} }

這種方式是在呼叫getinstance方法的時候才建立物件的,所以它就被稱為懶漢模式。

public class singleton ;  

public static synchronized singleton getinstance()

return instance;

} }

缺點:效率太低了,每個執行緒在想獲得類的例項的時候,執行getinstance()方法都要進行同步。而其實這個方法只執行一次例項化**就夠了,後面想獲得該例項,直接return就行了。方法進行同步效率太低要改進。

public class singleton7   

} return instance;

} }

這種寫法也是不安全的,當乙個執行緒還沒有例項化singleton時另乙個執行緒執行到if(instance == null)這個判斷時語句機會進入if語句,雖然加了鎖,但是等到第乙個執行緒執行完instance=new singleton()跳出這個鎖時,另乙個進入if語句的執行緒同樣會例項化另外乙個singleton物件。因為這種改進方法不可行。

public class singleton7 

} }

return instance;

} }

public class singleton1   

private static final singleton1 single = new singleton1();

//靜態工廠方法

public static singleton1 getinstance()

}

餓漢式在類建立的同時就已經建立好乙個靜態的物件供系統使用,以後不再改變,所以天生是執行緒安全的。

public class singleton   

private static final singleton1 single = new singleton1();

//靜態工廠方法

public static singleton1 getinstance()

}

這種寫法也是不安全的,當乙個執行緒還沒有執行到i++時另乙個執行緒執行到int i=0,導致i=1而不是2,應改為區域性變數寫法較好

單例模式的執行緒安全問題

單例會帶來什麼問題?如果多個執行緒同時呼叫這個例項,會有執行緒安全的問題 單例一般用在什麼地方?單例的目的是為了保證執行時只有唯一的乙個例項,最常用的地方比如拿到資料庫的連線,或者spring的中建立beanfactory操作,而這些操作都是呼叫他們的方法來執行某個特定的動作。首先先來認識下兩種模式...

單例模式的執行緒安全問題

大家都知道單例模式有兩種,分別是懶漢式 餓漢式。但是對於餓漢式,由於判斷例項為null與建立物件的操作並不是乙個原子性操作,故在 普通的懶漢式單例 非執行緒安全問題 1 2 created by ywb 3 4public class singleton 910 public static sing...

單例模式及執行緒安全問題

單例模式是為確保乙個類只有乙個例項,並為整個系統提供乙個全域性訪問點的一種模式方法。從概念中體現出了單例的一些特點 1 在任何情況下,單例類永遠只有乙個例項存在 2 單例需要有能力為整個系統提供這一唯一例項 下面是實現 package org.mlinge.s02 public class mysi...