单例模式
1、单例设计模式的简介#
采取一定的方法保证在整个软件系统中,某个类只存在一个对象实例
比如Hibernate的SessionFactory,他作为数据存储源的代理,负责创建Session对象,但是SessionFactory并不是轻量级的
,一般情况下,一个项目只需要一个SessionFactory就足够了,这就会使用到单例模式
2 单例设计模式的八种实现方式#
#
3 饿汉式(静态常量)#
/** * @author houChen * @date 2020/9/19 15:44 * @Description: 单例模式的饿汉式写法 */ public class SingletonTest01 { public static void main(String[] args) { Singleton instance = Singleton.getInstance(); Singleton instance1 = Singleton.getInstance(); System.out.println(instance==instance1); } } class Singleton{ //1、私有化构造器,这样外部就不能通过构造器来创建对象 private Singleton(){ } //2、本类内部创建对象实例 private final static Singleton instance = new Singleton(); //3、对外提供一个共有的静态方法,返回对象实例 public static Singleton getInstance(){ return instance; } }
4 饿汉式(静态代码块)#
/** * @author houChen * @date 2020/9/19 15:44 * @Description: 单例模式的饿汉式写法(静态代码块) */ public class SingletonTest02{ public static void main(String[] args) { Singleton instance = Singleton.getInstance(); Singleton instance1 = Singleton.getInstance(); System.out.println(instance==instance1); } } class Singleton{ //1、私有化构造器,这样外部就不能通过构造器来创建对象 private Singleton(){ } //2、本类内部创建对象实例 private static Singleton instance; //3、在静态代码块中创建单例对象 static { instance = new Singleton(); } //4、对外提供一个共有的静态方法,返回对象实例 public static Singleton getInstance(){ return instance; } }
5 懒汉式(线程不安全)#
public class SingletonTest03 { public static void main(String[] args) { Singleton instance = Singleton.getInstance(); Singleton instance1 = Singleton.getInstance(); System.out.println(instance==instance1); System.out.println(instance.hashCode()); System.out.println(instance1.hashCode()); } } class Singleton{ private static Singleton instance; private Singleton(){}; //提供一个静态的公有方法,当使用到该方法时,才会去创建instance public static Singleton getInstance(){
// 多个线程进来时,会创建多个 Singleton实例,这就违反了单例模式的设计原则 if(instance==null){ instance = new Singleton(); } return instance; } }
优缺点:
6 懒汉式(使用同步方法解决线程安全问题)#
/** * @author houChen * @date 2020/9/19 16:14 * @Description: 懒汉式 同步方法解决线程安全问题 */ public class SingletonTest04 { public static void main(String[] args) { Singleton instance = Singleton.getInstance(); Singleton instance1 = Singleton.getInstance(); System.out.println(instance==instance1); System.out.println(instance.hashCode()); System.out.println(instance1.hashCode()); } } class Singleton{ private static Singleton instance; private Singleton(){}; //提供一个静态的公有方法,当使用到该方法时,才会去创建instance public static synchronized Singleton getInstance(){ if(instance==null){ instance = new Singleton(); } return instance; } }
7 懒汉式(使用同步代码块)#
public class SingletonTest04 { public static void main(String[] args) { Singleton instance = Singleton.getInstance(); Singleton instance1 = Singleton.getInstance(); System.out.println(instance==instance1); System.out.println(instance.hashCode()); System.out.println(instance1.hashCode()); } } class Singleton{ private static Singleton instance; private Singleton(){}; //提供一个静态的公有方法,当使用到该方法时,才会去创建instance public static Singleton getInstance(){ if(instance==null){ synchronized(Singleton.class){ instance = new Singleton(); } } return instance; } }
8 双重检查#
/** * @author houChen * @date 2020/9/19 16:25 * @Description: 双重检查实现单例模式 */ public class SingletonTest06 { public static void main(String[] args) { Singleton instance = Singleton.getInstance(); Singleton instance1 = Singleton.getInstance(); System.out.println(instance==instance1); System.out.println(instance.hashCode()); System.out.println(instance1.hashCode()); } } class Singleton{ // volatile: 轻量级的synchronized, 由它修饰的变量在发生变化后会立即刷新到主存 private static volatile Singleton instance; private Singleton(){}; public static Singleton getInstance(){ if(instance==null){ synchronized (Singleton.class){ if(instance==null){ instance = new Singleton(); } } } return instance; } }
9 静态内部类#
/** * @author houChen * @date 2020/9/19 16:59 * @Description: 静态内部类实现单例模式 */ public class SingletonTest07 { public static void main(String[] args) { Singleton instance = Singleton.getInstance(); Singleton instance1 = Singleton.getInstance(); System.out.println(instance==instance1); System.out.println(instance.hashCode()); System.out.println(instance1.hashCode()); } } class Singleton{ private Singleton(){ } //写一个静态内部类,该类中有一个静态属性instance private static class SingletonInstance{ private static final Singleton instance= new Singleton(); } //提供一个静态的共有方法 public static Singleton getInstance(){ return SingletonInstance.instance; } }
#
10 枚举实现单例模式#
/** * @author houChen * @date 2020/9/19 17:06 * @Description: 枚举实现单例模式 */ public class SingletonTest08 { public static void main(String[] args) { Singleton instance = Singleton.INSTANCE; Singleton instance1 = Singleton.INSTANCE; System.out.println(instance==instance1); System.out.println(instance.hashCode()); System.out.println(instance1.hashCode()); } } //使用枚举 可以实现单例 enum Singleton{ INSTANCE; public void sayOk(){ System.out.println("say ok~"); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?