java并发之JMM(java内存模型)

java内存模型(JMM)是什么

  • JMM是一种抽象的概念,它描述的是一组规则或规范,将各种底层硬件以及操作系统的内存访问差异进行封装,使java程序在不同硬件以及操作系统上都能达到相同的并发效果。它分为工作内存和主内存,线程无法对主内存直接进行操作,如果一个线程要和另一个线程通信,那么只能借助主内存进行共享。

主内存与工作内存java并发之JMM(java内存模型)

  • 由于JVM运行程序的实体是线程,每个线程创建时JVM都会为其创建一个工作内存,工作内存是每个线程的私有数据区域。而JMM规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作(读取赋值等)必须在工作内存中进行,首先要将变量从主内存拷贝到自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,各个线程中的工作内存中存储着主内存的变量拷贝副本,线程之间无法访问对方的工作内存,线程间的通信必须通过主内存完成。
  • 每个线程只能够直接接触到工作内存,无法直接操作主内存,而工作内存中所保存的正是主内存的共享变量的副本,主内存和工作内存之间的通信是由 JMM 控制的。

JMM 规定

  1. 所有的变量都存储在主内存中,同时每个线程拥有自己独立的工作内存,而工作内存中的变量的内容是主内存中该变量的拷贝。
  2. 线程不能直接读 / 写主内存中的变量,但可以操作自己工作内存中的变量,然后再同步到主内存中,这样,其他线程就可以看到本次修改。
  3. 主内存是由多个线程所共享的,但线程间不共享各自的工作内存,如果线程间需要通信,则必须借助主内存中转来完成。