美文网首页
volicate、单例模式、jvm内存模型联系

volicate、单例模式、jvm内存模型联系

作者: 泽林呗 | 来源:发表于2019-03-27 17:18 被阅读0次

面试中,面试官问起单例模式时,我们是否只乖乖地回答了七种单例模式呢

七种单例模式实现

在单例模式的懒汉模式(线程安全实现)中,为什么需要更进一步地改为DCL(Double check)?这里其实涉及到Singleten对象在创建时的指令重排序问题。

Singleton = new Singleton();

抽象为jvm指令为

memory = allocate();    //1:分配对象的内存空间
initInstance(memory);    //2:初始化对象
instance = memory;        //3:设置instance指向刚分配的内存地址

因为2、3指令并不互相依赖,jvm可能把指令优化为

memory = allocate();    //1:分配对象的内存空间
instance = memory;        //3:设置instance指向刚分配的内存地址
initInstance(memory);    //2:初始化对象

而volicate又是怎么防止指令重排序的呢?

答:volatile关键字通过“内存屏障”来防止指令被重排序。

下面是基于保守策略的JMM内存屏障插入策略:

在每个volatile写操作的前面插入一个StoreStore屏障。
在每个volatile写操作的后面插入一个StoreLoad屏障。
在每个volatile读操作的后面插入一个LoadLoad屏障。
在每个volatile读操作的后面插入一个LoadStore屏障。

关于内存屏障可以参考下文
内存屏障

相关文章

  • volicate、单例模式、jvm内存模型联系

    面试中,面试官问起单例模式时,我们是否只乖乖地回答了七种单例模式呢 七种单例模式实现 在单例模式的懒汉模式(线程安...

  • 分享一下面试题

    阿里一面: 自我介绍; JVM内存模型; 你所知道的JVM几种gc算法; HashMap内部数据结构; 单例模式;...

  • 2022年3月Android面试题,包含vipkid,新氧,国美

    内存泄露 Looper,ThreadLocal 加载长图 jvm 类加载 单例模式,工厂模式,建造者模式 url输...

  • JVM内存模型(jvm 入门篇)

    概述 jvm 入门篇,想要学习jvm,必须先得了解JVM内存模型,JVM内存模型,JVM内存模型,JVM内存模型,...

  • Java内存模型(JMM)

    Java内存模型(JMM) 我们常说的JVM内存模式指的是JVM的内存分区;而Java内存模式是一种虚拟机规范。 ...

  • JMM内存模型详解

    Java内存模型(JMM) 我们常说的JVM内存模式指的是JVM的内存分区;而Java内存模式是一种虚拟机规范。 ...

  • 理解jvm(一)--内存模型

    此文以hotspot虚拟机为例来介绍jvm的内存模型。先来一张图吧,经典的jvm内存模型示意图 1、堆 堆...

  • 设计模式--单例模式

    单例模式概述 单例模式实现方式 为什么要使用单例模式 单例模式实现方式 饿汉式 类加载后就会将对象加载到内存中,保...

  • JAVA对象在JVM中内存分配

    如果你还不了解JVM内存模型的建议您先看下JVM内存模型 以一下代码为例,来分析下,java的实例对象在内存中的空...

  • 设计模式——单例模式

    单例模式属于创建模型。 单例模式,是设计模式中比较简单而又最常用的模式之一。通过单例模式可以保证系统中,应用该模式...

网友评论

      本文标题:volicate、单例模式、jvm内存模型联系

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