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是未初始化的。
相关推荐
地铁潜行者12 分钟前
从单体思维到微服务:服务拆分与组件选型实践
java·后端
花生了什么事o13 分钟前
线程池参数调优:corePoolSize 怎么设置
java·后端
灵性(๑>ڡ<)☆14 分钟前
Java学习笔记 --面向对象进阶
java·笔记·学习
写了20年代码的老程序员24 分钟前
Java Lambda 类型安全查询是怎么实现的?从字节码层面拆一遍
java·开源
唐青枫35 分钟前
Java RabbitMQ 实战指南:从交换机、队列到可靠消息处理
java
卓怡学长40 分钟前
w272基于springboot便民医疗服务小程序
java·spring boot·spring·小程序·intellij-idea
一方~42 分钟前
权限系统设计
java
蜗牛~turbo43 分钟前
金蝶云星空的网络控制设置
开发语言·c#·金蝶·erp·云星空·k3 cloud
盐焗鹌鹑蛋1 小时前
【C++】多态
java·jvm·c++
rebibabo1 小时前
Java高并发底层原理(七)volatile 到底解决了什么问题
java·学习笔记·volatile·可见性·有序性·指令重排