当前位置: 首页 > news >正文

【设计模式】单例模式的7种实现方法

一、饿汉式-线程安全

线程安全,但无法实现实例懒加载策略

/*** 饿汉式* @author CC* @version 1.0* @since2023/10/12*/
public class Singleton {private static final Singleton singleton = new Singleton();private Singleton() {}public static Singleton getSingleton() {return singleton;}
}

二、懒汉式-线程不安全

线程不安全,实现了实例懒加载策略。

/*** 懒汉式* @author CC* @version 1.0* @since2023/10/12*/
public class Singleton2 {private static Singleton2 singleton = null;private Singleton2() {}public static Singleton2 getSingleton() {if (singleton == null) {singleton = new Singleton2();}return singleton;}
}

三、全局锁式-线程安全

线程安全,实现了懒加载策略,但是线程同步效率不高。

/*** 全局锁* @author CC* @version 1.0* @since2023/10/12*/
public class Singleton3 {private static Singleton3 singleton;private Singleton3() {}public synchronized static Singleton3 getSingleton() {if (singleton == null) {singleton = new Singleton3();}return singleton;}
}

四、静态代码块式-线程安全

线程安全,类加载时初始化实例,实现了懒加载策略,线程安全。

/*** 静态代码块* @author CC* @version 1.0* @since2023/10/12*/
public class Singleton4 {private final static Singleton4 singleton;private Singleton4() {}static {singleton = new Singleton4();}public static Singleton4 getSingleton() {return singleton;}
}

五、双重校验锁式-线程安全

线程安全,且实现了懒加载策略,同时保证了线程同步时的效率。

/*** 双重校验锁* @author CC* @version 1.0* @since2023/10/12*/
public class Singleton5 {private  static Singleton5 singleton;private Singleton5() {}public static Singleton5 getSingleton() {if (singleton == null) {synchronized (Singleton5.class) {if (singleton == null) {singleton = new Singleton5();}}}return singleton;}
}

六、内部类-线程安全

线程安全,不存在线程同步问题,单例对象在程序第一次调用getInstance()时主动加载 SingletonHolder和其 静态成员INSTANCE,因而实现了懒加载策略。推荐使用。

/*** 内部类* @author CC* @version 1.0* @since2023/10/12*/
public class Singleton6 {private Singleton6() {}private static class Singleton6Holder {private static final Singleton6 INSTANCE  = new Singleton6();}public static Singleton6 getSingleton() {return Singleton6Holder.INSTANCE ;}
}

七、枚举类-线程安全

线程安全,不存在线程同步问题,且单例对象在枚举类型 INSTANCE第一次引用时通过枚举的 构造函数初始化,从而实现了懒加载策略。推荐使用。

/*** 枚举类* @author CC* @version 1.0* @since2023/10/12*/
public class Singleton7 {private Singleton7() {}enum SingletonEnum {INSTANCE;private final Singleton7 singleton;private SingletonEnum() {singleton = new Singleton7();}}public static Singleton7 getSingleton() {return SingletonEnum.INSTANCE.singleton;}
}

http://www.lryc.cn/news/190420.html

相关文章:

  • AlphaPose Pytorch 代码详解(一):predict
  • 日常学习记录随笔-zabix实战
  • vw+rem自适应布局
  • 【MySql】mysql之MHA高可用配置及故障切换
  • 如何在 Spring Boot 中进行数据备份
  • 为Yolov7环境安装Cuba匹配的Pytorch
  • SpringBoot基于jackson对象映射器扩展mvc框架的消息转换器
  • 计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度(matlab代码)
  • 【低代码表单设计器】:创造高效率的流程化办公!
  • 26、类型别名
  • nslookup命令查询指定域名或ingress地址对应的IP地址。举个例子
  • 如何设计一个网络爬虫?
  • 风储联合系统的仿真模型研究
  • JS VUE 用 canvas 给图片加水印
  • 主动配电网故障恢复的重构与孤岛划分matlab程序
  • 2023C语言暑假作业day6
  • java try 自动关闭流
  • WebDAV之π-Disk派盘 + 元思笔记
  • electron自定义标题栏,并监听双击以及右键改变窗口大小。
  • Beam Focusing for Near-Field Multi-User MIMO Communications阅读笔记
  • Unity基础课程之物理引擎6-关于物理材质的使用和理解
  • 用c语言写一个剪刀石头布小游戏
  • 【MySQL入门到精通-黑马程序员】MySQL基础篇-DCL
  • SpringBoot配置文件加载顺序
  • github小记(一):清除github在add或者commit之后缓存区
  • 【Debian系统】:安装debian系统之后,很多命令找不到,需要添加sudo之后才能使用,以下解决方法
  • 深入了解归并排序:原理、性能分析与 Java 实现
  • docker stop了一个docker exec容器,要怎么再启动呢
  • 【总结】kubernates 插件工具总结
  • RK3588平台产测之ArmSoM-W3 DDR带宽监控