併發程式設計5 單例

2021-09-10 01:27:14 字數 2868 閱讀 8453

/**

餓漢式單例模式-不會出現執行緒安全模式

*/public class singletonhunger

//類載入時就產生了instance物件

private static singletonhunger instance = new singletonhunger();

public static singletonhunger getinstance()

}

餓漢式單例模式的優缺點:

優點:類載入時產生instance,沒有對資源進行費原子性操作,所以不會出現安全問題.

缺點:載入過多無用例項

//出現了非原子性操作-會有多執行緒安全問題

public class singletonlazy1

private static volatile singletonlazy1 instance;

//這裡出現了非原子性操作-會有多執行緒問題

public static singletonlazy1 getinstance()

return instance;

}}

singletonlazy1_2:更明顯的執行緒安全問題

/**

* 懶漢式1-2-更明顯的執行緒安全問題(sleep了10ms)

*/public class singletonlazy1_2

private static volatile singletonlazy1_2 instance;

//這裡出現了非原子性操作-會有多執行緒問題

public static singletonlazy1_2 getinstance() catch (interruptedexception e)

instance = new singletonlazy1_2();

} return instance;

}}

public class singletonlazy2 

private static volatile singletonlazy2 instance;

/*** 雖然有synchronized具有如下特性:

* 偏向鎖(但是針對單執行緒訪問synchronized方法)

* 輕量鎖-第二個執行緒也能進入, 自旋,自旋還消耗cpu資源(相當於while true),還不如wait,wait不消耗cpu資源

* 所以如果synchronized放在方法中,對效能也不會很好

* * 分析出現執行緒不同步的場景:只有第一次載入的時候(多執行緒同時載入)才可能出現執行緒不同步的情況.

* 優化方式檢視singletonlazy3

*/public static synchronized singletonlazy2 getinstance() throws interruptedexception

return instance;

}}

雖然有synchronized具有如下特性:

偏向鎖(但是針對單執行緒訪問synchronized方法)

輕量鎖-第二個執行緒也能進入, 自旋,自旋還消耗cpu資源(相當於while true),還不如wait,wait不消耗cpu資源

所以如果synchronized放在方法中,對效能也不會很好

需要優化:

分析出現執行緒不同步的場景:只有第一次載入的時候(多執行緒同時載入判斷instance為null的之後,然後各自new instance)才可能出現執行緒不同步的情況.

優化方式檢視singletonlazy3

public class singletonlazy3 

//禁止指令重排序

private static volatile singletonlazy3 instance;

/*** 分析出現執行緒不同步的場景:只有第一次載入的時候(多執行緒同時載入)才可能出現執行緒不同步的情況.

* * 從普通synchronized公升級到 singletonlazy2 在公升級到 雙重鎖,在公升級到 volatile

* * 雙重檢查(兩次判斷instance == null)再加鎖

*/public static singletonlazy3 getinstance ()

}} return instance;

}}

public class testsingleton 

//1.測試飢漢模式

public static void testsinglehunger()

//2.測試懶漢模式

/*** 懶漢式1-1-執行緒安全問題

*/public static void testsinglelazy1()

});}

threadpool.shutdown();

}/**

* 懶漢式1-2-更明顯的執行緒安全問題

*/public static void testsinglelazy1_2()

});} threadpool.shutdown();

} public static void testsinglelazy2() throws exception catch (interruptedexception e)

}});

} threadpool.shutdown();

} public static void testsinglelazy3() throws exception

});} threadpool.shutdown();

}}

單例模式併發

在研究單例模式的時候,為了保證單例的懶載入是同步的,我們通常會選擇乙個duoble check的方法來保證只有第一次才new物件。1.雙重檢測同步延遲載入 如下 關於volatile的作用在這裡就是保證在new出物件的那一立馬寫入主存,同時通知其他執行緒的他們的cache是無效的,這樣instanc...

併發程式設計5

阻塞與非阻塞 阻塞 程式遇到io操作,導致 無法繼續執行,交出cpu執行權 非阻塞 沒有io操作或者遇到io操作也不阻塞 執行 寫程式時要儘量減少io操作 同步與非同步 同步 發起乙個任務後,必須原地等待任務執行結束,拿到乙個明確的結果 非同步 發起乙個任務後,不需要等待,繼續往下執行 非同步任務的...

單例模式 併發訪問

一 餓漢式 多執行緒併發,相對安全 class single private static final single s new single public static single getinstance 二 懶漢式 class single private static single s nu...