缓存行对齐

    cpu对于数据操作会基于缓存行,如果对于数据一致性操作在同一缓存行中效率会变低,如果缓存行对齐(64byte一个缓存行)64,64,64的操作会更快
    volatile尽量只用于基础数据类型,如果他无法检测到引用类型里面的引用值的改变,只能检测本身的改变
    volatile会保证缓存行数据的一致性,线程之间的可见性
    禁止指令重排序
    loadfence读屏障  cpu原语指令
    storefence写屏障 cpu原语指令
    mfence读写屏障  这两者都包括

    volatile虽然保证了线程可见性,但是并无法保证原子性,多个线程共同修改一个变量所带来的不一致问题不发解决
    多线程的变量共享保证一致性还是需要用到锁synchronized等原子性操作

缓存的一致性协议

    MESI Cache一致性协议(modified exclusive shared invaild)

    MESI代表四种状态
    m:被修改
    e:读栈
    s:共享读
    i:失效
    缓存一致性协议有很多,在cpu层级的最终办法急速锁总线方式保持一致性
    java的并发包中有相关写法,基本都是根据缓存行填充来写的,都是为了缓存行对齐

cpu的乱序执行

    cpu在多线程的情况下极有可能发生乱序执行,如果存在变量依赖就会出现问题

jvm层级—>内存屏障

    屏障两边的指令无法重排,保证有序
    jvm要求读与写指令之间添加屏障,不允许指令重排序

c++源码实现volatile关键代码

    lock;addl   (锁了总线)

cpu层级—>lock指令

文档更新时间: 2020-11-05 15:33   作者:mlrs