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 }