创建单例模式的六种方式

一、单例模式

  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);
	}
}
相关推荐
27669582922 分钟前
tiktok 弹幕 逆向分析
java·python·tiktok·tiktok弹幕·tiktok弹幕逆向分析·a-bogus·x-gnarly
用户403159863966319 分钟前
多窗口事件分发系统
java·算法
用户403159863966322 分钟前
ARP 缓存与报文转发模拟
java·算法
小林ixn25 分钟前
大一新手小白跟黑马学习的第一个图形化项目:拼图小游戏(java)
java
nbsaas-boot37 分钟前
Go语言生态成熟度分析:为何Go还无法像Java那样实现注解式框架?
java·开发语言·golang
hi0_641 分钟前
03 数组 VS 链表
java·数据结构·c++·笔记·算法·链表
朝如青丝暮成雪_44 分钟前
java的三大特征
java
用户0595661192091 小时前
Java 8 + 特性与 spring Boot 及 hibernate 等最新技术实操内容全解析
java·架构·设计
长安有故里y1 小时前
tomcat设置预防host头攻击
java·tomcat·firefox
生产队队长1 小时前
Tomcat问题:启动脚本startup.bat中文乱码问题解决
java·ajax·tomcat