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 }
本文来自博客园,作者:荣慕平,转载请注明原文链接:https://www.cnblogs.com/rongmuping/articles/16289368.html