JMM II
JMM
主存:共享资源;工作内存:局部变量。
- 原子性:保证执行不受线程上下文切换的影响【并发的影响】;
- 加锁;
- 可见性:保存不受cpu缓存的影响【JIT,缓存优化】;
- volatile:保证变量在多个线程的可见性【轻量级】;
- synchronized:也可以保证所见性,释放锁时触发内存同步【重量级】;
- Java 内存模型(JMM)规定,释放锁时会强制将线程本地内存的修改刷新到主内存,而获取锁时会从主内存重新加载变量
- 有序性:保证指令不受cpu指令并行优化的影响
- cpu指令并行优化
- JIT,执行并行优化;
volatile原理:
volatile的底层原理是内存屏障,Menory Barrier
-
对volatile变量的写操作后会加入写屏障;
- 写屏障【sfence】:保证在该屏障之前的,对共享变量的改动【所有的共享变量都会flush】,都会同步到主存中;
- 写屏障会确保指令重排序时,不会将写屏障之前的代码排在写屏障之后【屏障在后,保证不会后写,】;
-
对volatile变量的读操作前会加入读屏障;
- 读屏障:保证在该屏障之后,对共享变量的读取,加载的是主内存中最新的数据【所有的共享变量】【相当于清空缓存】;
- 读屏障会确保指令重排时,不会将都屏障之后的代码排在读屏障之前【屏障在前,保证不会前读】;
-
volatile主要针对的是线程内部的有序性,可见性,线程之间的上下文切换无法保证【原子性】
-
synchronized有序性,可见性,原子性都能保证;
- 有序性:仅仅在代码块内进行局部指令排序;
- 可见性:释放锁时会强制将线程本地内存的修改刷新到主内存【flush】,而获取锁时会从主内存重新加载变量;
- 原子性:锁的互斥性;
-
可见性【happen-before】:
- 线程的开启会自动内存读取共享变量,线程结束后会自动刷新共享变量;
- 线程被打断【interrupt】,相当于抛出异常,线程会自动刷新共享变量;
- 对默认值【0,false,null】的写,对其他线程可见【相当于仅作初始化】;
- 具有传递性;

浙公网安备 33010602011771号