Java 单例模式——双检锁

Java 单例模式------双检锁

双检锁: 双重检验锁

java 复制代码
public class Single {
    private volatile Single instance;

    public Single getInstance() {
        if (instance == null) {
            synchronized (Single.class) {
                if (instance == null)
                    instance = new Single();
            }
        }
        return instance;
    }
}

说明

volatile 关键字必须加,为了防止指令重排。

这段代码实际分为三步:

  1. 为instance分配空间
  2. 初始化 instance
  3. 将instance指向分配的内存地址
    多线程环境下,如果指令重排将顺序调整为 1->3->2 那么会导致线程拿到未实例化的对象。例如,线程t1执行了1和3,此时线程t2调用getInstance方法发现instance不为空,因此返回instance,但此时的instance是未初始化的。
相关推荐
const_qiu1 分钟前
第三章 08:3.10 本章小结
java·人工智能
Pniubi2 分钟前
快速排序(力扣基础)(递归)
java·数据结构·算法
H.莓飛18 分钟前
【Linux】自主 Shell
linux·运维·服务器·c语言·开发语言·visual studio
CarIise20 分钟前
Spring MVC 请求参数绑定与常用注解2
java·spring·mvc
熊猫钓鱼>_>21 分钟前
Kotlin Multiplatform for OpenHarmony 实战:kotlinx-coroutines 结构化并发适配
开发语言·kotlin·agent·harmonyos·openharmony·适配·华为云码道
七夜zippoe27 分钟前
Spring Boot 接通义千问:从拿 Key 到第一个对话接口跑通(保姆级)
java·spring boot·后端
SimonKing28 分钟前
别再花钱调 OCR 接口了!这个国产开源工具,免费还能离线跑
java·后端·程序员
Nebula_g28 分钟前
SpringBoot企业级实战项目—云禾外卖—SpringBoot常用注解解析
java·网络·数据库·spring boot·后端·spring·javase
const_qiu30 分钟前
第三章 07:3.9 能力收束与统一入口
java·人工智能
const_qiu33 分钟前
第三章 05:3.7 结构化输出与程序化消费
java·人工智能