创建单例模式的六种方式

一、单例模式

  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);
	}
}
相关推荐
长不大的杨瑞杰8 小时前
OpenCode v2 LSP 实战:内置语言服务器、自定义配置与诊断闭环
java·人工智能·typescript·lsp·opencode
云和数据.ChenGuang8 小时前
python和java的try
java·开发语言·python
日日大王学编程8 小时前
阿里巴巴开源 Data Agent(Text2SQL)项目全维度详解
java·ai·开源
Wang's Blog8 小时前
Java 项目实战:交友项目 - 交友左滑右滑
java·交友
测试盐8 小时前
spark作业日志定位过程
java·hadoop·spark
ly76898 小时前
从 OpenAPI 到多语言 SDK 生成:Java 服务端契约漂移与生成器版本治理
java·开发语言·openapi·java 21·版本兼容·契约漂移·sdk 生成
lqbzlll8 小时前
CVE-2026-91403 排查指南:Java JSSE 信任链漏洞的根因、影响范围和修复步骤
java·开发语言·信任链
CarIise8 小时前
AOP 概念的引入
java·开发语言
重生之我是Java开发战士8 小时前
【Redis】Java & JavaSpring 客户端
java·redis·bootstrap
郭小李9 小时前
mybatis的 Mapper.xml语法
xml·java·mybatis