單例有多種的寫法,本例是懶漢式單例的一種寫法。在高并發環境下需要注意的是:
1.單例在并發訪問并調用其相應的getInstance方法的時候也會造成創建多個實例對象,加鎖是必要的。
2.使用synchronized是比較好的解決方案,優點是代碼簡潔,缺點是在拋出異常的時候不能處理維護使系統處于良好狀態。
3.顯示的lock設定是良好的解決方案。
使用lock的代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
package demo; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 參考使用 * @author Watson_Xu * @date 2012-1-8 下午04:31:09 */ public final class SingletonContext { private static SingletonContext sc = null ; private SingletonContext() { } private static Lock lock = new ReentrantLock(); public static SingletonContext getInstance() { if (sc == null ) { lock.lock(); if (sc == null ) { try { sc = new SingletonContext(); } finally { lock.unlock(); } } } return sc; } } |
使用synchronized的時候代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
package demo; /** * 參考使用 * * @author Watson_Xu * @date 2012-1-8 下午04:31:09 */ public final class SingletonContext { private static SingletonContext sc = null ; private SingletonContext() { } public static synchronized SingletonContext getInstance() { if ( null == sc) { sc = new SingletonContext(); } return new SingletonContext(); } } |
查看更多Java的語法,也希望大家多多支持服務器之家。