单例模式
分为饿汉模式及懒汉模式
饿汉模式是初始化时创建。
懒汉模式是使用时创建。
饿汉模式:
1 2 3 4 5 6 7 8 9 10 11 | public class Student1 { // 2:成员变量初始化本身对象 private static Student1 student = new Student1(); // 1:构造私有 private Student1() { } // 3:对外提供公共方法获取对象 public static Student1 getSingletonInstance() { return student; } } |
懒汉模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class Student5 { private Student5() { } /* * 此处使用一个内部类来维护单例 JVM在类加载的时候,是互斥的,所以可以由此保证线程安全 问题 */ private static class SingletonFactory { private static Student5 student = new Student5(); } /* 获取实例 */ public static Student5 getSingletonInstance() { return SingletonFactory.student; } } |
饿汉模式经典的三种实现
1、双重检查锁(DCL)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public class DoubleCheckLockSingleton { private static volatile DoubleCheckLockSingleton instance; private DoubleCheckLockSingleton() {} public static DoubleCheckLockSingleton getInstance() { if (instance == null ) { synchronized (DoubleCheckLockSingleton. class ) { if (instance == null ) { instance = new DoubleCheckLockSingleton(); } } } return instance; } public void tellEveryone() { System.out.println( "This is a DoubleCheckLockSingleton " + this .hashCode()); } } |
其中,synchronized防止CPU指令重排,导致极端情况下,没有初始化完成时,新的子线程就进入到synchronized后了
2、静态内部类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class StaticInnerHolderSingleton { private static class SingletonHolder { private static final StaticInnerHolderSingleton INSTANCE = new StaticInnerHolderSingleton(); } private StaticInnerHolderSingleton() {} public static StaticInnerHolderSingleton getInstance() { return SingletonHolder.INSTANCE; } public void tellEveryone() { System.out.println( "This is a StaticInnerHolderSingleton" + this .hashCode()); } } |
调用StaticInnerHolderSingleton.getInstance时,内部静态类才会创建,并且线程安全
3、枚举模式
1 2 3 4 5 6 | public enum EnumSingleton { INSTANCE; public void tellEveryone() { System.out.println( "This is an EnumSingleton " + this .hashCode()); } } |
枚举模式防止被反射攻击和序列化攻击。 因为JVM中,枚举类型不允许进行反射及序列化
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
2019-04-22 windows7搜索python java go php等其他文件内容
2015-04-22 ORCFILE,ParquetFile,CubeFile使用场景区别