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不做排序优化

相关推荐
燃尽余火3 分钟前
Knife4j 文档展示异常的小坑
java·开发语言·spring
渣哥17 分钟前
如果没有双亲委派,Java 会乱成什么样?
java
jokr_25 分钟前
C++ STL 顶层设计与安全:迭代器、失效与线程安全
java·c++·安全
Code_Artist30 分钟前
[Java并发编程]6.并发集合类:ConcurrentHashMap、CopyOnWriteArrayList
java·后端·源码阅读
爬虫程序猿33 分钟前
利用 Java 爬虫按关键字搜索 1688 商品详情 API 返回值说明实战指南
java·开发语言·爬虫
Bling_Bling_137 分钟前
ES6新语法特性(第二篇)
开发语言·前端·es6
前端赵哈哈1 小时前
初学者入门:Android 实现 Tab 点击切换(TabLayout + ViewPager2)
android·java·android studio
jokr_1 小时前
C++ 指针与引用面试深度解析
java·c++·面试
杨杨杨大侠1 小时前
第6篇:链路追踪系统 - 分布式环境下的请求跟踪
java·后端·apache log4j
乘风归趣1 小时前
spire.doc在word中生成公式
java·开发语言·word