当前位置: 首页 > 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.");}
}

相关文章:

  • 【JAVA GUI+MYSQL]社团信息管理系统
  • Vue-cli
  • UV贴图和展开初学者指南
  • x-cmd pkg | usql - SQL 数据库的通用交互界面
  • Zookeeper+Kafka概述
  • 构建中国人自己的私人GPT
  • RT-Thread入门笔记2-动态内存堆的使用
  • Docker安装Nacos2.2.3并鉴权、Prometheus监听Nacos、Grafana监控Nacos【亲测可用】
  • Redis 7.0性能大揭秘:如何优化缓存命中率?
  • react+AntDesign 之 pc端项目案例
  • SpikingJelly笔记之泊松编码
  • Linux备忘手册
  • ML:2-4理解python如何实现forward prop
  • TypeScript使用技巧内置工具类型详解
  • 抛弃安卓,追赶iOS,鸿蒙能否成为中国第二大系统?
  • chrome扩展demo1-小时钟
  • codis proxy处理流程
  • ES6--对象的扩展
  • flask接收请求并推入栈
  • js中的正则表达式入门
  • spring + angular 实现导出excel
  • Travix是如何部署应用程序到Kubernetes上的
  • Vue2.0 实现互斥
  • 想写好前端,先练好内功
  • 新书推荐|Windows黑客编程技术详解
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • mysql面试题分组并合并列
  • #、%和$符号在OGNL表达式中经常出现
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (转)http协议
  • (转)shell调试方法
  • (转)Unity3DUnity3D在android下调试
  • (转)平衡树
  • .FileZilla的使用和主动模式被动模式介绍
  • .gitignore文件—git忽略文件
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET CORE Aws S3 使用
  • .NET delegate 委托 、 Event 事件
  • .Net Remoting常用部署结构
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .netcore如何运行环境安装到Linux服务器
  • .NET分布式缓存Memcached从入门到实战
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • /usr/bin/env: node: No such file or directory
  • @RequestMapping处理请求异常
  • []我的函数库
  • [Android] Amazon 的 android 音视频开发文档
  • [dfs] 图案计数
  • [DM复习]Apriori算法-国会投票记录关联规则挖掘(上)
  • [FxCop.设计规则]8. 也许参数类型应该是基类型
  • [Gamma]阶段测试报告
  • [IE编程] IE中对网页进行截图的编程接口
  • [Latex] Riemann 问题中的激波,接触间断,膨胀波的 Tikz 绘图