美文网首页
Java内存模型的三大特性

Java内存模型的三大特性

作者: zivxia | 来源:发表于2018-04-12 15:34 被阅读56次

之所以关注这个java内存模型的三大特性,源于看到java单例模式的最佳懒汉模式的写法:

// 双重校验锁DCL(double checked locking)
public class Singleton {
    private static volatile Singleton sInstance;
    private Singleton() {
    }
    public static Singleton getInstance() {
        if (sInstance == null) {
            synchronized (Singleton.class) {
                if (sInstance == null) {
                    sInstance = new Singleton();
                }
            }
        }
        return sInstance;
    }
}

如果没有用volatile修饰的话,这个获取到的单例实例是有问题的。因为

sInstance = new Singleton();

不是原子性的,它其实是一下三个步骤

  • 1.为对象分配内存
  • 2.执行构造方法语句,初始化实例对象
  • 3.把sInstance的引用指向分配的内存空间

这三个步骤不一定是按顺序执行的,因为在Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。所以可能执行的顺序是1-->3-->2
当执行完3时,这时候sInstance不为空,但是未进行初始化,这时候cpu切换执行权,另外一个线程在执行外层的

if(sInstance == null){
}

发现sInstance不为null,则直接return回来了,因为这个实例是未进行初始化的,所以是有问题的。
这是后就必须加上volatile,volatile能保证可见性和有序性,可以阻止

sInstance = new Singleton();

的重排序,按照正常1-->2-->3执行。而synchronized只能保证互斥性和原子性。这里可以参考下,大神的关于java内存模型的知识

Java并发编程:volatile关键字解析

相关文章

  • 多线程下指令重排与DCL单列模式

    指令重排简述 1、JMM内存模型三大特性包括原子性,可见性,有序性。详细请看关于Java内存模型的三大特性 2、指...

  • 2.深入volatile

    1.并发基础 2.java内存模型&jvm内存模型 上图可以清除看出,每个工作线程都有独立的内存空间 3.特性 可...

  • 图解jvm--(四)内存模型

    内存模型 java 内存模型 很多人将【java 内存结构】与【java 内存模型】傻傻分不清,【java 内存模...

  • 并发编程(一)—— volatile关键字和 atomic包

    Java内存模型 JMM(java内存模型) java虚拟机有自己的内存模型(Java Memory Model,...

  • 第12章 Java内存模型与线程

    第12章 Java内存模型与线程 12.3Java内存模型 Java内存模型 [1](Java Memory Mo...

  • 深入理解Java并发内存模型

    Java内存模型是什么 Java 内存模型翻译自Java Memory Model,也称Java多线程内存模型,简...

  • 深入理解volatile

    JMM Java 内存模型 Java的内存模型指定了Java虚拟机如何与计算机的内存进行工作 Java内存模型决定...

  • Java内存模型&Volatile

    1.Java内存模型 1.1 Java内存模型(JMM) Java线程间的通信由Java内存模型(JMM)控制,J...

  • Java基础之内存模型

    Java基础之内存模型 目录 Java内存模型简单介绍 JVM介绍 存储方式 并发原因 Java内存模型与系统内存...

  • Java运行时数据区

    Java内存模型 Java内存模型,就是Java程序运行时的内存模型。而Java代码是在Java虚拟机上运行的,由...

网友评论

      本文标题:Java内存模型的三大特性

      本文链接:https://www.haomeiwen.com/subject/kqzxkftx.html