基于深度学习图像分割的无人机洪水灾害图像分割检测与水量估算 洪水分割数据集 图像分割算法

核心内容摘要

P8598 [蓝桥杯 2013 省 AB] 错误票据【计数排序+最值】
WuliArt Qwen-Image Turbo实际作品展示:LoRA定制化风格迁移生成效果实测

研究生数理统计实战:从点估计到回归分析的5大核心考点解析(附例题+资料)

DCL 是什么DCLDouble Check Lock双重检查锁是 Java 中懒加载单例模式的高性能实现方案核心思路是第一次检查无锁判断实例是否已初始化避免每次调用都加锁提升性能加锁保证多线程下只有一个线程能进入初始化逻辑第二次检查防止多个线程等待锁后重复初始化实例。

它解决了传统 “懒汉式同步方法” 每次调用都加锁的性能问题同时保证线程安全。

DCL 完整实现代码标准写法public class SingletonDCL { //

必须加 volatile 关键字 private static volatile SingletonDCL INSTANCE; //

私有构造器禁止外部实例化 private SingletonDCL() {} //

双重检查锁的核心方法 public static SingletonDCL getInstance() { // 第一次检查无锁快速判断实例是否已存在 // 若已存在直接返回无需加锁提升高并发性能 if (INSTANCE null) { // 加锁保证同一时间只有一个线程能进入初始化逻辑 synchronized (SingletonDCL.class) { // 第二次检查防止多个线程等待锁后重复创建实例 if (INSTANCE null) { // 初始化实例 INSTANCE new SingletonDCL(); } } } return INSTANCE; } }

DCL 核心逻辑拆解为什么要 “双重检查”假设高并发场景下有 3 个线程T

T

T3同时调用getInstance()T1 先执行第一次检查INSTANCE null为 true进入加锁逻辑第二次检查仍为 true执行INSTANCE new SingletonDCL()初始化完成后释放锁T2 随后执行第一次检查INSTANCE已不为 null直接返回实例无需加锁T3 与 T1 同时执行T3 先通过第一次检查此时 T1 还未完成初始化等待 T1 释放锁后进入加锁逻辑第二次检查发现INSTANCE已被 T1 初始化直接返回避免重复创建。

如果去掉 “第二次检查”T3 会在 T1 释放锁后重新创建实例导致单例失效。

为什么必须加volatile面试必考这是 DCL 最核心的坑点INSTANCE new SingletonDCL()看似一行代码实际 JVM 会拆分为 3 步执行

分配内存空间给 SingletonDCL 实例

初始化实例执行构造器逻辑给成员变量赋值

将 INSTANCE 引用指向分配的内存空间此时 INSTANCE 不再为 null。

JVM 为了优化性能可能会对这 3 步进行指令重排比如重排为 1→3→2导致问题T1 执行时JVM 先执行 1→3INSTANCE 不为 null但实例还未初始化T2 此时第一次检查INSTANCE ! null直接返回这个 “半初始化” 的实例T2 调用实例的方法时会因实例未初始化完成抛出空指针或逻辑错误。

volatile关键字的核心作用禁止 JVM 对指令重排保证 1→2→3 的执行顺序确保其他线程看到的INSTANCE要么是 null要么是完全初始化的实例。

DCL 的常见误区避坑错误写法问题说明去掉volatile可能拿到 “半初始化” 实例线程安全失效去掉第二次检查多线程等待锁后重复创建实例单例失效同步代码块锁对象错误比如锁thisstatic方法中this不存在且锁对象不唯一线程安全失效把INSTANCE定义为finalfinal变量必须初始化无法实现懒加载

DCL 的优缺点优点缺点

懒加载实例仅在第一次调用时初始化节省内存

高性能仅初始化时加锁后续调用无锁

线程安全双重检查 volatile 保证单例唯一性

实现稍复杂新手易遗漏 volatile

无法解决 “反射 / 序列化破坏单例” 的问题需额外处理

在早期 JDK

4 及之前中volatile 实现有缺陷DCL 可能失效现代 JDK 已修复

DCL 的适用场景高并发场景下的懒加载单例比如工具类、连接池、配置中心实例对内存占用敏感需要延迟初始化的场景追求高性能不希望每次调用都加锁的场景。

总结DCL 是 “懒加载 高性能 线程安全” 的单例实现方案核心是 “两次检查 加锁 volatile”volatile是 DCL 的关键用于禁止指令重排避免拿到半初始化实例第二次检查不可省略否则多线程下会重复创建实例现代 JDK

5中 DCL 是安全的是生产环境中最常用的单例实现方式之一。

www.91.cqdw.gov.cn--www.91.cqdw.gov.cn-最新版v.27.68.16-2265安卓网应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123