单例模式之饿汉式与懒汉式

 1 package com.example.demo02.singleton;
 2 
 3 /**
 4  * 懒汉式
 5  */
 6 class LazySingleton {
 7     //  私有的构造函数
 8     private LazySingleton() { }
 9 
10     private static LazySingleton lazySingleton;
11 
12     // 公有的获取对象的方法  synchronized保证只有一个线程访问
13      public static synchronized LazySingleton getInstance() {
14         if (lazySingleton == null) {
15             lazySingleton = new LazySingleton();
16         }
17         return lazySingleton;
18     }
19 
20     public static LazySingleton getLazySingletonDoubleCheckLock() {
21         //  第一重检查
22         if (lazySingleton == null) {
23             // 上同步锁
24             synchronized (LazySingleton.class) {
25                 // 第二重检查
26                 if (lazySingleton == null) {
27                     lazySingleton = new LazySingleton();
28                 }
29             }
30         }
31         //  当lazySingleton不是null的时候就不用考虑线程安全问题
32          return lazySingleton;
33     }
34 
35 }
36 
37 /**
38  * 饿汉式
39  */
40 class HungrySingleton {
41     private HungrySingleton(){}
42 
43     private static HungrySingleton hungrySingleton = new HungrySingleton();
44 
45     public static HungrySingleton getHungrySingleton() {
46         return hungrySingleton;
47     }
48 
49 }
50 
51 
52 
53 public class Singleton {
54 
55     public static void main(String[] args) {
56         // 懒汉式
57         LazySingleton lazySingleton = LazySingleton.getInstance();
58         LazySingleton lazySingleton2 = LazySingleton.getInstance();
59         System.out.println(lazySingleton == lazySingleton2);
60 
61         // 懒汉式 双重检查锁
62         LazySingleton lazySingletonDoubleCheckLock = LazySingleton.getLazySingletonDoubleCheckLock();
63         LazySingleton lazySingletonDoubleCheckLock2 = LazySingleton.getLazySingletonDoubleCheckLock();
64         System.out.println(lazySingletonDoubleCheckLock == lazySingletonDoubleCheckLock2);
65 
66         // 饿汉式
67         HungrySingleton hungrySingleton = HungrySingleton.getHungrySingleton();
68         HungrySingleton hungrySingleton2 = HungrySingleton.getHungrySingleton();
69         System.out.println(hungrySingleton == hungrySingleton2);
70     }
71 
72 }

 

posted on 2018-10-27 23:19  jovelove  阅读(121)  评论(0)    收藏  举报