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

设计模式 - 单例模式 - Tips

为什么双重检查会带来空指针异常问题?

if (instance == null) {             synchronized (Singleton.class) {                                 if (instance == null) {                     instance = new Singleton();                 }             }         
}

instance = new Singleton();

上述加粗的代码并不是原子操作,包含三个步骤:

  1. 为 Singleton 分配内存地址

  2. 执行 Singleton() 构造方法,初始化成员变量等

  3. 将内存地址赋值给 instance 变量

假设线程 A 正在执行:

instance = new Singleton();   

由于指令重排序,线程 A 可能在构造函数执行之前,就已经将内存地址赋值给 instance,导致 instance 变为非 null。此时线程 B 会认为 instance 已经是合法对象,于是直接使用,结果可能:

  • 访问尚未初始化的字段

  • 抛出 NullPointerException

  • 出现逻辑错误或不可预知的行为

为什么可以通过静态内部类实现懒汉式单例模式

public class Singleton {     private Singleton() {}     private static class SingletonHolder {         private static final Singleton INSTANCE = new Singleton();     }        public static Singleton getInstance() {              return SingletonHolder.INSTANCE; }  
}

这依赖于 Java 类加载机制的特性:

  • JVM 在加载外部类的过程中不会加载静态内部类,只有内部类的属性 / 方法被调用时才会进行加载(懒汉式

  • JVM 在加载类的时候会自动保证线程安全,一个类在 JVM 中只会被加载一次

http://www.xdnf.cn/news/6825.html

相关文章:

  • 面试真题 - 高并发场景下Nginx如何优化
  • 开源安全大模型Foundation-Sec-8B实操
  • C语言_动态内存管理
  • 18.自动化生成知识图谱的多维度质量评估方法论
  • (9)python开发经验
  • NDS3211HV单路H.264/HEVC/HD视频编码器
  • math toolkit for real-time development读书笔记一三角函数快速计算(1)
  • Guided Filtering相关记录
  • 牛客网NC22222:超半的数
  • 登高架设作业人员的职业发展方向有哪些?
  • Lazada测评补单系统搭建指南:从环境到账号的要点把控
  • 深入解析Shell脚本编程:从基础到实战的全面指南
  • L52.【LeetCode题解】二分法习题集1
  • BigemapPro小技巧:如何只显示特定区域内的点
  • Linux 内核版本详解
  • 数据中心末端配电监控产品
  • STM32F407VET6实战:CRC校验
  • Python-homework
  • 1Panel应用推荐:Beszel轻量级服务器监控平台
  • UE RPG游戏开发练手 第二十七课 普通攻击2
  • 使用Mathematica制作Lorenz吸引子的轨道追踪视频
  • 海盗王3.0的数据库3合1并库处理方案
  • 【全解析】EN18031标准下的SUM安全更新机制
  • VBA技术资料MF306:删除与正则表达式匹配的文件
  • 10 大医学数据集汇总:覆盖问答/推理/真实临床记录/超声图像/CT 影像……
  • 多网卡管理实战指南:原理、问题分析与实用工具推荐
  • vs2019及以后版本cmd指定编译环境文件的路径
  • Linux》Ubuntu》安装Harbor 私有仓库
  • Manim教程:第12章 函数,函数图像和文字的渲染
  • 高清箱号识别系统:模糊集装箱号的高效识别解决方案