SingletonPattern_Demo

 1 package com.miaoshaproject.demo;
 2 
 3 /**
 4  * @Author wangshuo
 5  * @Date 2022/5/19, 16:19
 6  * 几个单例模式的demo
 7  */
 8 public class SingletonPattern_Demo {
 9 
10     //----------------------------懒汉式单例模式--------------------------------
11 
12     //简单懒汉式单例模式(线程不安全)
13     public static class Singleton_1 {
14 
15         private static Singleton_1 singleton_1;
16 
17         //私有构造方法 外界无法通过new进行创建
18         private Singleton_1() {
19         }
20 
21         //对外提供单例对象获取方法
22         public static Singleton_1 getSingleton_1() {
23             return singleton_1;
24         }
25     }
26 
27     //线程安全的懒汉式单例(使用了synchronized关键字。资源消耗较大)
28     public static class Singleton_2 {
29 
30         private static Singleton_2 singleton2;
31 
32         //私有构造方法
33         private Singleton_2() {
34         }
35 
36         //对外提供线程安全的单例对象获取方法
37         public static synchronized Singleton_2 getSingleton_2() {
38             if (singleton2 == null)
39                 singleton2 = new Singleton_2();
40             return singleton2;
41         }
42     }
43 
44     //资源消耗较小且线程安全的懒汉式单例
45     public static class Singleton_3 {
46 
47         //volatile保证可见性 防止高并发情况下出现指令重排
48         private volatile static Singleton_3 singleton_3;
49 
50         private Singleton_3() {
51         }
52 
53         //把锁锁在更深处了 同时进行双重校验 防止出现并发问题
54         public static Singleton_3 getSingleton_3() {
55             if (singleton_3 == null) {
56                 synchronized (Singleton_3.class) {
57                     if (singleton_3 == null)
58                         singleton_3 = new Singleton_3();
59                 }
60             }
61             return singleton_3;
62         }
63     }
64 
65     //----------------------------饿汉式单例模式--------------------------------
66 
67     //简单的饿汉单例模式(线程安全)
68     public static class Singleton_4 {
69 
70         //使用final关键字(无法进行二次赋值)
71         //实例被静态和final了,在类第一次被加载到内存时就初始化(这也造成了一定的资源浪费)
72         private static final Singleton_4 singleton_4 = new Singleton_4();
73 
74         private Singleton_4() {
75         }
76 
77         public static Singleton_4 getSingleton_4() {
78             return singleton_4;
79         }
80     }
81 
82     //复杂的饿汉单例模式(使用静态内部类)
83     public static class Singleton_5 {
84      private String str;
85         //用于创建Singleton_5的工具人(其实它是懒汉式的) 工厂模式
86         private static class Singleton_5_Factory {
         //业务代码
87 private static final Singleton_5 singleton_5 = new Singleton_5("根据业务场景自行创建"); 88 } 89 90 private Singleton_5(String paramString) {
         str = paramString;
91 } 92 93 //把创建方法静态final化(调用该方法之后才会创建Singleton_5实例) 94 private static final Singleton_5 getSingleton_5(){ 95 return Singleton_5_Creater.singleton_5; 96 } 97 } 98 }