《2019年阿裡雲雙11活動拼團》: https://www.aliyun.com/1111/2019/group-buying-share 【限時】1年86元,3年229元,用來建站和程式設計學習【 附WordPress建站教程
】
飽漢模式(懶漢模式)
1 // 飽漢
2 // UnThreadSafe
3 public class Singleton1 {
4 private static Singleton1 singleton = null;
5 private Singleton1() {
6 }
7 public static Singleton1 getInstance() {
8 if (singleton == null) {
9 singleton = new Singleton1();
10 }
11 return singleton;
12 }
13 }
優點:懶加載啟動快,資源占用小,使用時才執行個體化,無鎖。
缺點:非線程安全。
飽漢模式(懶漢模式)--線程安全
1 public class Singleton {
2
3 /**
4 * 定義一個變量來存儲建立好的類執行個體
5 */
6
7 private static Singleton uniqueInstance = null;
8
9 /**
10 * 私有化構造方法,好在内部控制建立執行個體的數目
11 */
12
13 private Singleton(){
14 }
15
16 /**
17 * 定義一個方法來為用戶端提供類執行個體
18 * @return 一個Singleton的執行個體
19 */
20
21 public static synchronized Singleton getInstance(){
22
23 //判斷存儲執行個體的變量是否有值
24 if(uniqueInstance == null){
25 //如果沒有,就建立一個類執行個體,并把值指派給存儲類執行個體的變量
26 uniqueInstance = new Singleton();
27 }
28
29 //如果有值,那就直接使用
30 return uniqueInstance;
31 }
32
33 /**
34 * 示意方法,單例可以有自己的操作
35 */
36
37 public void singletonOperation(){
38
39 //功能處理
40
41 }
42
43 /**
44 * 示意屬性,單例可以有自己的屬性
45 */
46
47 private String singletonData;
48
49 /**
50 * 示意方法,讓外部通過這些方法來通路屬性的值
51 * @return 屬性的值
52 */
53
54 public String getSingletonData(){
55
56 return singletonData;
57
58 }
59
60 }
優點:同上,但加鎖了。
缺點:synchronized 為獨占排他鎖,并發性能差。即使在建立成功以後,擷取執行個體仍然是串行化操作。
飽漢模式(懶漢模式)--雙重加鎖檢查DCL(Double Check Lock)
1 public class Singleton {
2
3 /**
4 * 對儲存執行個體的變量添加volatile的修飾
5 */
6
7 private volatile static Singleton instance = null;
8
9 private Singleton(){
10
11 }
12
13 public static Singleton getInstance(){
14
15 //先檢查執行個體是否存在,如果不存在才進入下面的同步塊
16
17 if(instance == null){
18
19 //同步塊,線程安全的建立執行個體
20
21 synchronized(Singleton.class){
22
23 //再次檢查執行個體是否存在,如果不存在才真的建立執行個體
24
25 if(instance == null){
26
27 instance = new Singleton();
28
29 }
30
31 }
32
33 }
34
35 return instance;
36
37 }
38
39 }
優點:懶加載,線程安全。
注:執行個體必須有 volatile 關鍵字修飾,其保證初始化完全。
餓漢模式
1 public class Singleton {
2
3 //4:定義一個靜态變量來存儲建立好的類執行個體
4
5 //直接在這裡建立類執行個體,隻會建立一次
6
7 private static Singleton instance = new Singleton();
8
9 //1:私有化構造方法,好在内部控制建立執行個體的數目
10
11 private Singleton(){
12
13 }
14
15 //2:定義一個方法來為用戶端提供類執行個體
16
17 //3:這個方法需要定義成類方法,也就是要加static
18
19 //這個方法裡面就不需要控制代碼了
20
21 public static Singleton getInstance(){
22
23 //5:直接使用已經建立好的執行個體
24
25 return instance;
26
27 }
28
29 }
優點:餓漢模式天生是線程安全的,使用時沒有延遲。
缺點:啟動時即建立執行個體,啟動慢,有可能造成資源浪費。
Holder模式
1 public class Singleton {
2 /**
3 * 類級的内部類,也就是靜态的成員式内部類,該内部類的執行個體與外部類的執行個體
4 * 沒有綁定關系,而且隻有被調用到才會裝載,進而實作了延遲加載
5 */
6 private static class SingletonHolder{
7 /**
8 * 靜态初始化器,由JVM來保證線程安全
9 */
10 private static Singleton instance = new Singleton();
11 }
12 /**
13 * 私有化構造方法
14 */
15 private Singleton(){
16 }
17 public static Singleton getInstance(){
18 return SingletonHolder.instance;
19 }
20 }
優點:将懶加載和線程安全完美結合的一種方式(無鎖)。(推薦)
備注:
- 全局共享,獨一份;
- 構造函數不暴露(如果暴露便不能保證一份),自己負責自己的構造;
- 懶漢式:Lazy load,用到才加載,非線程安全。如何保證線程安全呢:
(1) synchronized getInstance()。
(2)雙重檢查加鎖(volatile)。
- 餓漢式:一開始就申請好,浪費了點資源,但其線程安全。
- Holder模式:
(1)改成内部類,由JVM保證線程安全性。