单例模式:饿汉式、懒汉式;线程安全的单例模式创建的6种方式

单例模式

单例模式Singleton是一种创建型模式,指某个采用Singleton单例模式,则这个类在同一个

JVM上,只能产生一个实例供外部访问,并且仅提供一个全局的访问方式。

懒汉式

懒汉式线程不安全

java 复制代码
public class Singleton1 {
	private static Singleton1 instance;
	
	// 构造方法私有化!!!
	private Singleton1() {};
	
	public static Singleton1 getInstance() {
		if(instance == null) {
			instance = new Singleton1();
		}
		return instance;
	}
}

饿汉式

饿汉式线程安全

java 复制代码
public class Singleton2 {
	private static final Singleton2 instance = new Singleton2();
	// 构造方法私有化
	private Singleton2() {};

	public static Singleton2 getInstance() {
		return instance;
	}
}

线程安全的单例模式

  1. 饿汉式线程安全
  2. 全局锁线程安全
  3. 静态代码块创建单例对象线程安全
  4. 双重校验锁实现线程安全
  5. 静态内部类实现线程安全的单例模式
  6. 内部枚举类实现线程安全
  • 全局锁

    java 复制代码
    public class Singleton3 {
    	private static Singleton3 instance;
    
    	// 构造方法私有化
    	private Singleton3() {};
    
    	// 通过synchronized添加全局锁实现线程安全
    	public static synchronized Singleton3 getInstance() {
    		if (instance == null) {
    			instance = new Singleton3();
    		}
    		return instance;
    	}
    }
  • 静态代码块

    java 复制代码
    public class Singleton4 {
    	private static final Singleton4 instance;
    	
    	// 静态代码块创建单例对象
    	static {
    		instance = new Singleton4();
    	}
    	
    	// 构造方法私有化
    	private Singleton4(){}
      
    	public static Singleton4 getInstance() {
    		return instance;
    	}
    }
  • 双重校验锁

    java 复制代码
    public class Singleton5 {
    
    	private static Singleton5 instance;
    
    	private Singleton5() {
    	}
    
    	public static Singleton5 getInstance() {
    		if (instance == null) {
    			synchronized (Singleton5.class) {
    				if (instance == null) {
    					instance = new Singleton5();
    				}
    			}
    		}
    		return instance;
    	}
    }
  • 静态内部类

    java 复制代码
    public class Singleton6 {
    	// 构造方法私有化
    	private Singleton6() {};
    	
    	// 静态内部类
    	private static class SingletonHolder{
    		// 创建单例对象
    		private static Singleton6 instance = new Singleton6();
    	}
    	public static Singleton6 getInstance() {
    		return Singleton6.SingletonHolder.instance;
    	}
    }
  • 静态枚举类

    java 复制代码
    public class Singleton7 {
    	private Singleton7() {}
    	
    	// 内部枚举类
    	enum SingletonEnum{
    		INSTANCE;
    		
    		// 单例对象
    		private Singleton7 instance;
        
    		private SingletonEnum() {
    			instance = new Singleton7();
    		}
        
    		private static Singleton7 getInstance() {
    			return SingletonEnum.INSTANCE.instance;
    		}
    	}
    }	
相关推荐
极小狐3 小时前
极狐GitLab 项目功能和权限解读
运维·git·安全·gitlab·极狐gitlab
国科安芯5 小时前
面向高性能运动控制的MCU:架构创新、算法优化与应用分析
单片机·嵌入式硬件·安全·架构·机器人·汽车·risc-v
迷路的小绅士6 小时前
常见网络安全攻击类型深度剖析(四):跨站脚本攻击(XSS)——分类、漏洞利用与前端安全防护
前端·安全·web安全
自由鬼7 小时前
开源漏洞扫描器:OpenVAS
运维·服务器·安全·网络安全·开源·漏洞管理
Python_金钱豹7 小时前
Text2SQL零代码实战!RAGFlow 实现自然语言转 SQL 的终极指南
前端·数据库·sql·安全·ui·langchain·机器人
广东航连科技8 小时前
银行网点款箱交接权限认证开锁与密钥时效双重监控
物联网·安全·银行·精细化管理·锁控·智能锁·款箱
迷路的小绅士8 小时前
网络安全概述:定义、重要性与发展历程
网络·安全·web安全
胡八一10 小时前
如何在 Dialog 中安全初始化 ECharts 并自动监听容器大小变化
前端·安全·echarts
virelin_Y.lin12 小时前
系统与网络安全------弹性交换网络(2)
网络·安全·web安全·链路聚合·lacp·eth-trunk
大小曲奇(´ε` )15 小时前
使用安全继电器的急停电路设计
安全