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

  • 相关阅读:
    .Net vs Java?
    使用HyperV安装Linux系统
    C#调用Lua
    KubernetesService介绍服务发现
    缓存雪崩、缓存击穿和缓存穿透
    10 个开源项目
    minikube cncf.io
    Parallel的使用
    通过Rancher Desktop在桌面上运行K8s
    2021 .NET 开发者峰会顺利在网上落幕,线上直播回看汇总
  • 原文地址:https://www.cnblogs.com/hzzjj/p/15585884.html
Copyright © 2011-2022 走看看