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

相关推荐
小马爱打代码几秒前
Spring Boot项目开发常见问题及解决方案(下)
java·spring boot·后端
潜意识起点2 分钟前
计算机专业文献检索期末论文
java·开发语言
Tiger Z11 分钟前
R 语言科研绘图第 11 期 --- 柱状图-基础
开发语言·程序人生·r语言·贴图
岁月如歌,青春不败13 分钟前
R语言森林生态系统结构、功能与稳定性分析与可视化
开发语言·人工智能·python·深度学习·r语言
Q_192849990641 分钟前
基于Spring Boot的工商局商家管理系统
java·spring boot·后端
m0_748232641 小时前
[MySQL报错]关于发生net start mysql 服务无法启动,服务没有报告任何错误的五种解决方案。
java
Godlovesea1 小时前
ubuntu控制器多网口配置
开发语言·php
小学鸡!1 小时前
idea报错:There is not enough memory to perform the requested operation.
java·intellij-idea
web136885658711 小时前
rust教程 第一章 —— 初识rust
开发语言·后端·rust
songroom1 小时前
Rust : tokio中select!
开发语言·后端·rust