并发编程-Java内存模型(JMM)

上一篇 <<<锁的优化
下一篇 >>>Volatile解决JMM的可见性问题


Java内存模型(JMM):定义了一个线程对另一个线程可见。

JMM和JVM的区别

  • JVM是内存结构
  • JMM是内存模型

JMM核心

定义了线程和主内存之间的抽象关系:
线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。
本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。

并发编程-Java内存模型(JMM)_第1张图片

主内存:
存放我们共享变量的数据
工作内存:
每个CPU对共享变量(主内存)的副本。堆+方法区
注意:当多个线程同时访问一个数据的时候,可能本地内存A没有及时刷新到主内存中,本地内存B读取的时候会造成脏读,也就是会发生线程安全问题。但加上关键字Volatile就会立马告知。

JMM同步8大步骤

并发编程-Java内存模型(JMM)_第2张图片
  • (1)lock(锁定):作用于 主内存的变量,把一个变量标记为一条线程独占状态
  • (2)unlock(解锁):作用于 主内存的变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定
  • (3)read(读取):作用于 主内存的变量,把一个变量值从主内存传输到线程的 工作内存中,以便随后的load动作使用
  • (4)load(载入):作用于 工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中
  • (5)use(使用):作用于 工作内存的变量,把工作内存中的一个变量值传递给执行引擎
  • (6)assign(赋值):作用于 工作内存的变量,它把一个从执行引擎接收到的值赋给工作内存的变量
  • (7)store(存储):作用于 工作内存的变量,把工作内存中的一个变量的值传送到 主内存中,以便随后的write的操作。【CPU总线和嗅探机制,含MESI协议】
  • (8)write(写入):作用于 工作内存的变量,它把store操作从工作内存中的一个变量的值传送到 主内存的变量中

相关文章链接:
<<<多线程基础
<<<线程安全与解决方案
<<<锁的深入化
<<<锁的优化
<< << << << << << << << << << <<<线程池
<<<并发队列
<< << << << <<<如何优化多线程总结

你可能感兴趣的:(并发编程-Java内存模型(JMM))