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

设计模式——单例模式

单例模式

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

懒汉式单例在第一次使用时才创建实例,但这种方式在多线程环境下是不安全的。
public class Singleton {  private static Singleton instance;  private Singleton() {}  public static Singleton getInstance() {  if (instance == null) {  instance = new Singleton();  }  return instance;  }  
}

2. 懒汉式(线程安全)

通过在getInstance()方法上添加synchronized关键字,使其在多线程环境下也能正常工作,但这样会降低效率。
public class Singleton {  private static Singleton instance;  private Singleton() {}  public static synchronized Singleton getInstance() {  if (instance == null) {  instance = new Singleton();  }  return instance;  }  
}

3. 双重检查锁定

这种方式既保证了线程安全,又避免了同步带来的性能影响。
注意:这里使用了volatile关键字,它禁止了指令重排序,确保了在多线程环境下instance变量的可见性和有序性。
public class Singleton {  private static volatile Singleton instance;  private Singleton() {}  public static Singleton getInstance() {  if (instance == null) {  synchronized (Singleton.class) {  if (instance == null) {  instance = new Singleton();  }  }  }  return instance;  }  
}

4. 饿汉式

饿汉式单例在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快。
public class Singleton {  private static final Singleton instance = new Singleton();  private Singleton() {}  public static Singleton getInstance() {  return instance;  }  
}

5. 静态内部类

这种方式利用了类加载机制来保证初始化实例时只有一个线程,并且实现了懒加载。
public class Singleton {  private Singleton() {}  private static class SingletonHolder {  private static final Singleton INSTANCE = new Singleton();  }  public static final Singleton getInstance() {  return SingletonHolder.INSTANCE;  }  
}

6.枚举

通过Java的枚举,可以更简洁地实现单例模式,并且自动支持序列化机制,防止多次实例化。
public enum Singleton {  INSTANCE;  public void whateverMethod() {  }  
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • VB 函数
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • 【C++精华铺】11.STL vector模拟实现
  • helm安装解决无授权问题
  • 宝塔:如何开启面板ssl并更新过期ssl
  • 【ROS2】中级:Launch-管理大型项目
  • Flutter RSA公钥转PEM
  • IntelliJ IDEA社区版在Windows电脑中的下载、安装方法
  • 【IT领域新生必看】编程中的错误处理大师:解密 `throw` 和 `throws` 的神秘差异
  • 【安全设备】数据库审计
  • vue 路由
  • JavaSE学习笔记第二弹——对象和多态(下)
  • 等保测评视角下的哈尔滨智慧城市安全框架构建
  • 2019年美赛题目Problem A: Game of Ecology
  • 硅纪元AI应用推荐 | 百度橙篇成新宠,能写万字长文
  • 《深入 React 技术栈》
  • CentOS7简单部署NFS
  • create-react-app做的留言板
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • JavaScript设计模式系列一:工厂模式
  • Laravel 菜鸟晋级之路
  • laravel 用artisan创建自己的模板
  • RxJS: 简单入门
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • V4L2视频输入框架概述
  • webpack入门学习手记(二)
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 应用生命周期终极 DevOps 工具包
  • 函数计算新功能-----支持C#函数
  • ​​​【收录 Hello 算法】9.4 小结
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • ​批处理文件中的errorlevel用法
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • (06)Hive——正则表达式
  • (145)光线追踪距离场柔和阴影
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (阿里云万网)-域名注册购买实名流程
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (二)Linux——Linux常用指令
  • (二十六)Java 数据结构
  • (分布式缓存)Redis哨兵
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (一)RocketMQ初步认识
  • (转)创业的注意事项
  • (转载)深入super,看Python如何解决钻石继承难题
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .Net6使用WebSocket与前端进行通信
  • .NET命令行(CLI)常用命令
  • .NET未来路在何方?
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • .Net中ListT 泛型转成DataTable、DataSet
  • //TODO 注释的作用
  • /var/lib/dpkg/lock 锁定问题