创建单例模式的六种方式

一、单例模式

  1. 单例模式是一种创建型的设计模式,构造函数是私有的,因此只能在类中创建一个实例,且对外提供一个静态公有方法获取这个实例。

二、创建方法

1. 懒汉式(线程不安全)

java 复制代码
public class Singleton{
	private static Singleton instance;
	private Singleton(){}
	public static Singleton getInstance(){
		if(instance==null){ //多线程时,此处会产生线程安全问题
			instance = new Singleton();
		}
		return instance;
	}
}

2. 懒汉式(线程安全)

java 复制代码
public class Singleton{
	private static Singleton instance;
	private Singleton(){}
	public synchronized static Singleton getInstance(){
		if(instance==null){
			instance=new Singleton();
		}
		return instance;
	}

3. 双重检查锁(DCL,Double-Checked Locking)(线程安全)

java 复制代码
public class Singleton{
	private volatile static Singleton instance;
	private Singleton(){};
	public static Singleton getInstance(){
		if(instance==null){
			synchronized(Singleton.class){
				if(instance==null){
					instance=new Singleton();
				}
			}
		}
		return instance;
	}
}

4. 饿汉式(线程安全)

java 复制代码
public class Singleton{
	private final static Singleton instance=new Singleton();
	private Singleton(){}
	public static Singleton getInstance(){
		return instance;
	}

5. 静态内部类(线程安全)

java 复制代码
public class Singleton{
	private Singleton(){}
	private static class InnerClass{
		private final static Singleton INSTANCE=new Singleton();
	} 
	public static Singleton getInstance(){
		return InnerClass.INSTANCE;
	}
}

6. 枚举类(线程安全)

java 复制代码
public enum Singleton{
	INSTANCE;
	public void doSomething(String str){
		System.out.println(str);
	}
}
相关推荐
霸道流氓气质3 分钟前
多Agent通信机制与协议设计完全指南:从FIPA-ACL到A2A/MCP的Java生产级实战
java·开发语言
007张三丰9 分钟前
C/C++ 内存管理详解:从内存分布到 new/delete 底层原理
java·c语言·c++·内存管理
骇客野人27 分钟前
Java BIO / NIO / AIO 完整详解 + 编程技巧
java·开发语言·nio
霸道流氓气质30 分钟前
OpenTelemetry 入门与实战:Java Agent、Spring Boot Starter与LLM调用追踪示例
java·开发语言·spring boot
m0_5873830036 分钟前
24 小时自助健身房系统软件开发实战指南与案例解析
java·spring boot·spring·系统架构·需求分析
栖凤42 分钟前
Java 的 try-catch 在 Agent 里失效了,我用了 5 个模式才兜住
java·前端·python
小师兄吃牛肉42 分钟前
Java 同步系列之 ZooKeeper 分布式锁
java·分布式·java-zookeeper
马剑威(威哥爱编程)1 小时前
【AI全栈后端12-12】Spring Boot 3.x 到 4.x 迁移实操:Jakarta 11、Jackson 3 与 AI 2.0
java·开发语言·spring boot·后端
Gauss松鼠会1 小时前
【GaussDB】破除gaussdb ugin索引支持中文模糊查询的迷思-字符序
java·运维·服务器·网络·数据库·gaussdb·经验总结
IT研究室1 小时前
最新计算机毕业设计选题推荐-基于spring boot的心桥·心理健康综合服务平台-网站-文档指导-Java-springboot
java·spring boot·课程设计