JMM
CPU的运算能力远远超出了主内存的读取数据能力,所以在CPU中存在高速缓存区Cache来作为内存和处理器之间的缓冲(将运算需要使用的数据复制到缓存中,让运算能快速的进行,当运算结束后再从缓存同步回内存之中,这样处理器就无需等待内存读写了),使得CPU在运算过程中直接从高速缓存区中读取数据,其在单线程下是没有问题的,且性能也有了很大的提升。但是在多线程中由于多核CPU每个处理器都有自己的缓存区,导致了数据不一致性,也就是缓存一致性问题。而JMM内存模型就是用来解决该问题的
内存模型
JMM(Java Memony Model)java内存模型,主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量(包括实例变量、静态变量和构成数组对象的元素,但不包括局部变量与方法参数,因为其是线程私有的,不会存在竞争问题)的底层细节,JMM描述了java线程如何通过内存进行交互,java程序中各种变量(线程共享变量)的访问规则,以及在jvm中将变量存储到内存和从内存中读取出变量的底层细节,决定一个线程对共享变量的写入何时对另一个线程可见
- 线程之间的共享变量都存储在主内存
- 每个线程都有自己独立的工作内存,里面保存该线程使用到的变量的主内存副本拷贝,线程读写变量时操作的是自己工作内存中的变量(线程操作共享变量时,先从主内存复制共享变量到自己的工作内存,然后对工作内存里的变量进行处理,处理完之后将变量值更新到主内存),不可以直接操作主内存的变量
- 线程A无法直接访问线程B的工作内存,必须经过主内存
- 堆内存在线程之间共享,局部变量、方法参数、异常处理器参数不会在线程之间共享