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是未初始化的。
相关推荐
为java加瓦几秒前
单例模式:原理、实现与演进
单例模式
学Linux的语莫18 分钟前
机器学习数据处理
java·算法·机器学习
找不到、了18 分钟前
JVM的即时编译JIT的介绍
java·jvm
csbysj202037 分钟前
如何使用 XML Schema
开发语言
R6bandito_42 分钟前
STM32中printf的重定向详解
开发语言·经验分享·stm32·单片机·嵌入式硬件·mcu
earthzhang20211 小时前
【1007】计算(a+b)×c的值
c语言·开发语言·数据结构·算法·青少年编程
西瓜er1 小时前
JAVA:Spring Boot 集成 FFmpeg 实现多媒体处理
java·spring boot·ffmpeg
你总是一副不开心的样子(´ . .̫ .1 小时前
一、十天速通Java面试(第三天)
java·面试·职场和发展·java面试
杨枝甘露小码1 小时前
Python学习之基础篇
开发语言·python
迎風吹頭髮1 小时前
UNIX下C语言编程与实践63-UNIX 并发 Socket 编程:非阻塞套接字与轮询模型
java·c语言·unix