一 硬件内存架构
CPU处理速度远大于内存处理速度,因此中间设置有高速缓存(cache,可以有多级)。这样会引发数据的一致性问题,即对于共享的数据而言,怎样保证各个CPU拿到的一致。
解决方案:
1. 总线加锁。优点:实现简单;缺点:降低CPU吞吐量。
2. 缓存一致性协议(MESI)
当CPU在CACHE中操作数据时,如果该数据是共享变量,数据在CACHE读到寄存器中,进行新修改,并更新内存数据
CACHE LINE置无效,其他的CPU就从内存中读数据。
二 JMM
JMM,即JAVA内存模型,是一种规范,是一个概念。
JMM将内存分为两类:共享内存(主内存)和工作内存(工作空间)。
1. 共享内存:所有线程共享的内存空间。
2. 工作内存:线程私有的内存空间。
对于引用对象而言,引用的地址放在工作内存,引用的对象放在堆中。
3. 工作方式
- 线程修改私有数据,直接在工作空间修改
- 线程修改共享数据,把数据复制到工作空间中去,在工作空间中修改,修改完成以后,刷新内存中的数据
三 JMM与硬件内存的对应关系
四 JMM要保证的3个特性
原子性:不可分割
可见性:线程只能操作自己工作空间中的数据,对于共享数据,有线程修改了其值,如何保证其他线程可见。
有序性:程序中的顺序不一定就是执行的顺序:编译重排序、指令重排序(目的是 提高效率)
JMM如何保证原子性的方式: Synchronized;加锁,使用JUC(java.util.concurrent并发包)中的锁 lock。
JMM如何保证可见性的方式: Volatile;Synchronized;加锁,使用JUC(java.util.concurrent并发包)中的锁 lock。
JMM如何保证有序性: Volatile;Synchronized;Happens-before原则:
- 程序次序原则
- 锁定原则 :后一次加锁必须等前一次解锁
- Volatile原则:霸道原则
- 传递原则:A---B ---C A--C
五 JVM内存区域与JMM
JVM内存区域是JVM使用内存区域的一种虚拟划分;JMM是一种规范,一种概念,面向的问题是原子性、可见性和有序性。