zoukankan      html  css  js  c++  java
  • java volatile

    可见性:
    volatile的功能就是被修饰的变量在被修改后可以立即同步到主内存,被修饰的变量在每次是用之前都从主内存刷新。本质也是通过内存屏障来实现可见性
    写内存屏障(Store Memory Barrier)可以促使处理器将当前store buffer(存储缓存)的值写回主存
    读内存屏障(Load Memory Barrier)可以促使处理器处理invalidate queue(失效队列)。进而避免由于Store Buffer和Invalidate Queue的非实时性带来的问题。

    禁止指令重排序:
    volatile是通过内存屏障来禁止指令重排序
    JMM内存屏障的策略
        在每个 volatile 写操作的前面插入一个 StoreStore 屏障
        在每个 volatile 写操作的后面插入一个 StoreLoad 屏障
        在每个 volatile 读操作的后面插入一个 LoadLoad 屏障
        在每个 volatile 读操作的后面插入一个 LoadStore 屏障

     8种情况禁止重排序(happens-before)

    缓存行对齐

    缓存行64个字节是CPU同步的基本单位,缓存行隔离会比伪共享效率要高 应用 Disruptor

    系统底层如何实现数据一致性
    1. MESI如果能解决,就使用MESI
    2. 如果不能,就锁总线

    系统底层如何保证有序性
    1. 内存屏障sfence mfence lfence等系统原语
    2. 锁总线

    volatile如何解决指令重排序
    1: volatile i
    2: ACC_VOLATILE
    3: JVM的内存屏障 屏障两边的指令不可以重排!保障有序!
    4:hotspot实现 bytecodeinterpreter.cpp

  • 相关阅读:
    模糊化控制
    第8章 控制对象的访问(setter、getter、proxy)
    第7章 面向对象与原型
    Termux键盘配置
    在md里画流程图
    设置浏览器不缓存文件
    安卓手机使用Termux及搭建FTP服务器
    第6章 未来的函数:生成器和promise
    第5章 精通函数:闭包和作用域
    第4章 函数进阶:理解函数调用
  • 原文地址:https://www.cnblogs.com/hzzjj/p/15585884.html
Copyright © 2011-2022 走看看