單例模式中可能存在的一些問題(執行緒安全問題)
單例的設計模式中,一些程式碼的寫法會存線上程安全的問題,舉例如下:
(1)單例模式的懶漢式[執行緒不安全,不可用]
public class Singleton {
private static Singleton instance=null;
private Singleton() {};
public static Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
這種方式是在呼叫getInstance方法的時候才建立物件的,所以它就被稱為懶漢模式。
這是存線上程安全問題的,那具體是存在怎樣的執行緒安全問題?怎樣導致這種問題的?好,我們來說一下什麼情況下這種寫法會有問題。在執行過程中可能存在這麼一種情況:多個執行緒去呼叫getInstance方法來獲取Singleton的例項,那麼就有可能發生這樣一種情況,當第一個執行緒在執行if(instance==null)時,此時instance是為null的進入語句。在還沒有執行instance=new Singleton()時(此時instance是為null的)第二個執行緒也進入了if(instance==null)這個語句,因為之前進入這個語句的執行緒中還沒有執行instance=new Singleton(),所以它會執行instance = new Singleton()來例項化Singleton物件,因為第二個執行緒也進入了if語句所以它會例項化Singleton物件。這樣就導致了例項化了兩個Singleton物件。所以單例模式的懶漢式是存線上程安全的,既然它存在問題,那麼可能有解決辦法,於是就有下面加鎖這種寫法。
(2)懶漢式執行緒安全的[執行緒安全,效率低不推薦使用]
public class Singleton {
private static Singleton instance=null;
private Singleton() {};
public static synchronized Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
缺點:效率太低了,每個執行緒在想獲得類的例項的時候,執行getInstance()方法都要進行同步。而其實這個方法只執行一次例項化程式碼就夠了,後面想獲得該例項,直接return就行了。方法進行同步效率太低要改進。
(3)單例模式懶漢式[執行緒不安全,不可用]
public class Singleton7 {
private static Singleton instance=null;
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
instance = new Singleton();
}
}
return instance;
}
}
這種寫法也是不安全的,當一個執行緒還沒有例項化Singleton時另一個執行緒執行到if(instance == null)這個判斷時語句機會進入if語句,雖然加了鎖,但是等到第一個執行緒執行完instance=new Singleton()跳出這個鎖時,另一個進入if語句的執行緒同樣會例項化另外一個SIngleton物件。因為這種改進方法不可行。
總結:
以上就是單例模式中,會引發的執行緒安全問題了
相關文章
- 單例模式執行緒安全reorder問題單例模式執行緒
- 單例模式(上)—如何優雅地保證執行緒安全問題單例模式執行緒
- 單例模式(上)---如何優雅地保證執行緒安全問題單例模式執行緒
- parallelStream中的執行緒安全問題Parallel執行緒
- 單例模式中的DDCP可能出現的問題單例模式
- 模板方法中的執行緒安全問題執行緒
- lambda中stream執行緒安全的問題執行緒
- ArrayList 的執行緒安全問題執行緒
- 03 執行緒安全問題執行緒
- SimpleDateFormat 執行緒安全問題ORM執行緒
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- JUC之集合中的執行緒安全問題執行緒
- 深入JAVA執行緒安全問題Java執行緒
- Java 執行緒安全問題的本質Java執行緒
- 探究Spring中Bean的執行緒安全性問題SpringBean執行緒
- 多執行緒,你覺得你安全了?(執行緒安全問題)執行緒
- SpringMVC中出現的執行緒安全問題分析SpringMVC執行緒
- 多執行緒的安全性問題(三)執行緒
- 從FMDB執行緒安全問題說起執行緒
- 執行緒問題2(注意例項變數)執行緒變數
- Java中解決多執行緒資料安全問題Java執行緒
- 多執行緒的安全問題及解決方案執行緒
- 執行緒中斷以及執行緒中斷引發的那些問題執行緒
- 多執行緒併發安全問題詳解執行緒
- 5分鐘搞懂多執行緒安全問題執行緒
- Python執行緒安全問題及解決方法Python執行緒
- Spring中多執行緒的使用及問題Spring執行緒
- 你的單例模式真的是執行緒安全的嗎?單例模式執行緒
- 密碼找回功能可能存在的問題密碼
- 企圖使用c++執行緒解決nodejs單執行緒問題C++執行緒NodeJS
- 深入解讀HashMap執行緒安全性問題HashMap執行緒
- Java面試中,一些常見的有關多執行緒問題!Java面試執行緒
- 多執行緒相關問題執行緒
- 多執行緒問題解釋執行緒
- JUC之多執行緒鎖問題執行緒
- 【多執行緒】常見問題簡單總結執行緒
- 【iOS – OC】OC基礎-單例的實現 & 提醒自己注意多執行緒問題iOS單例執行緒
- J2SE - 關於SimpleDateFonnat的執行緒安全問題執行緒