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

设计模式之单例模式的懒饿汉

懒汉式

说白了就是你不叫我我不动,你叫我我才动。

类初始化模式,也叫延迟占位模式。在单例类的内部由一个私有静态内部类来持有这个单例类的实例。因为在 JVM 中,对类的加载和类初始化,由虚拟机保证线程安全。

public class Single {private Single() {}private static class InitData{private static Single single = new Single();}public static Single getSingle(){return InitData.single;}
}

延迟占位模式还可以用在多线程下实例域的延迟赋值,以避免并发访问时可能导致的问题。
举个例子如下:

假设我们有一个实例域,需要在首次访问时进行初始化,我们希望在多线程环境下进行延迟初始化,同时保证线程安全。

public class LazyInitializationExample {private ExpensiveObject expensiveObject; // 需要延迟初始化的对象public ExpensiveObject getExpensiveObject() {if (expensiveObject == null) { // 未初始化时进行延迟初始化synchronized (this) {if (expensiveObject == null) { // 双重检查,避免多线程下重复初始化expensiveObject = new ExpensiveObject();}}}return expensiveObject;}
}

在这个例子中,ExpensiveObject是一个开销较大的对象,我们希望在首次访问时进行初始化。我们使用了双重检查的方式,在未初始化时进行同步,并在同步块内再次检查是否已经被初始化,以避免多线程下重复初始化的问题。

这样,在多线程环境中,不同线程在首次访问getExpensiveObject方法时,会根据expensiveObject是否为空进行延迟初始化,并通过同步块保证线程安全。这就是一个在多线程环境下使用延迟占位模式进行实例域的延迟赋值的例子。


饿汉式

说白了就是你不叫我动,我都要动。

在声明的时候就 new 这个类的实例或者使用枚举也可以。

public class EagerSingleton {// 在类加载时进行初始化private static EagerSingleton instance = new EagerSingleton();// 私有构造方法,避免外部创建实例private EagerSingleton() {}// 获取单例实例的静态方法public static EagerSingleton getInstance() {return instance;}// 其他成员方法public void doSomething() {System.out.println("Singleton is doing something.");}
}
http://www.lryc.cn/news/277736.html

相关文章:

  • 多平台多账号一站式短视频管理矩阵营销系统下载
  • go work
  • 基于JavaWeb+BS架构+SpringBoot+Vue智能菜谱推荐系统的设计和实现
  • SpringSecurity集成JWT实现后端认证授权保姆级教程-授权配置篇
  • 关系型非关系型数据库区别,以MongoDB为例在express中连接MongoDB示例
  • Java版商城:Spring Cloud+SpringBoot b2b2c实现多商家入驻直播带货及 免 费 小程序商城搭建的完整指南
  • 【Spring Boot】SpringBoot maven 项目创建图文教程
  • 【Python】Sigmoid和Hard Sigmoid激活函数对比总结及示例
  • ajax+axios——统一设置请求头参数——添加请求头入参——基础积累
  • Redis高可用(主从复制、哨兵模式和Cluster集群)
  • 【Web】CTFSHOW PHP命令执行刷题记录(全)
  • 鸿蒙开发已解决-Failed to connect to gitee.com port 443: Time out 连接超时提示
  • 使用cURL命令在Linux中测试HTTP服务器的性能
  • 机器学习 -- 余弦相似度
  • LeNet-5(fashion-mnist)
  • Unity中URP下开启和使用深度图
  • 类似东郊到家上门预约系统需要具备哪些功能,预约系统应该怎么做
  • 鸿蒙APP和Android的区别
  • 给Flutter + FireBase 增加 badge 徽章,App启动器 通知红点。
  • 2024年中国杭州|网络安全技能大赛(CTF)正式开启竞赛报名
  • 112.Qt中的窗口类
  • 如何设置电脑桌面提醒,电脑笔记软件哪个好?
  • C# HttpClient Get Post简单封装
  • 创建网格(Grid/GridItem)
  • 思科路由器忘记密码怎么重置
  • JVM基础(2)——JVM内存模型
  • 使用 Process Explorer 和 Windbg 排查软件线程堵塞问题
  • 做科技类的展台3d模型用什么材质比较好---模大狮模型网
  • EasyExcel简单实例(未完待续)
  • ROS2学习笔记一:安装及测试