【JVM】JMM导致的问题和解决手段

思路:

  • cpu多级缓存 - 伪共享
    • 解决一致性
      • 缓存锁MESI + 总线锁
      • 缓存行填充
    • cpu指令乱序
      • 演示demo
      • 为什么乱序 - 好处
        • 因为cpu比内存块太多,为了充分压榨cpu
      • cpu内存屏障阻止乱序
        • sfence&lfence&mfence
  • volatile实现
    • 字节码层面
      • 在access flag上标识了他是volatile的 - demo
    • jvm层面
      •  SS 写操作 SL  
      •  LL 读操作 LS
    • 操作系统
      • lock指令
        • 写操作会回写到主内存,其他线程有读操作只能读取最新的
  • synchronized实现
    • 字节码层面
      • 修饰代码块 monitorenter & 2 monitorexit
      • 修饰方法 同volatile会有一个修饰符标识
    • jvm
      • c语言调用操作系统同步机制 - monitor对象和reentrant实现很类似
    • 操作系统
      • lock指令 - metux 用户态到内核态切换决定哪个线程有锁
    • 锁升级
原文地址:https://www.cnblogs.com/nightOfStreet/p/13302920.html