java单列标准写法

单例模式使用volatile保证有序性的例子
复制代码
public class Singleton {
    public static volatile Singleton singleton;

    /**
     * 构造函数私有,禁止外部实例化
     */
    private Singleton() {};

    public static Singleton getInstance() {
        if (singleton == null) {
            synchronized (singleton) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

先要了解对象的构造过程,实例化一个对象其实可以分为三个步骤:

分配内存空间。

  1. 初始化对象。
  2. 将内存空间的地址赋值给对应的引用。
  3. 但是由于操作系统可以对指令进行重排序,所以上面的过程也可能会变成如下过程:
  • 分配内存空间。
  • 将内存空间的地址赋值给对应的引用。
  • 初始化对象

如果是这个流程,第一个线程singleton = new Singleton();时候可能将一个未初始化的对象引用暴露出来(即把一个未初始化的对象的引用地址赋值给引用变量),第2个线程在第一个if (singleton == null) 时判断对象不是空了,直接返回一个未初始化的对象

我们需要将变量设置为volatile类型的变量不让编译器和cpu不做排序优化

相关推荐
会编程的土豆8 小时前
Go 里的 error 接口 + 假 nil(超级重点)
开发语言·后端·golang
愿天垂怜8 小时前
【C++脚手架】ffmpeg 库的介绍与使用
linux·服务器·开发语言·c++·ide·git·ffmpeg
涛声依旧-底层原理研究所8 小时前
Node.js在高并发低延迟场景中的优势
java·人工智能·python·node.js
并不喜欢吃鱼8 小时前
从零开始 C++-----十一【C++ 数据结构】红黑树全解析:从定义到工程实现(一文搞定,十分详细)
开发语言·数据结构·c++
不会C语言的男孩8 小时前
C++ Primer Plus 第7章:函数——C++的编程模块
开发语言·c++
方也_arkling8 小时前
【Java-Day09】继承
java·开发语言
西安邮电大学8 小时前
Kafka保证消息顺序性
java·后端·kafka
迈巴赫车主8 小时前
蓝桥杯21247弹跳鞋java
java·开发语言·数据结构·算法·职场和发展·蓝桥杯
HEADKON8 小时前
司拉德帕失代偿期肝硬化及胆道梗阻患者禁止使用,肝酶升高需暂停药物
单例模式
xinhuanjieyi8 小时前
JavaFX WebView 不支持 Brotli (br) 压缩编码警告修复
java