===java内存模型的作用。
java内存模型定义了线程和线程和线程和主内存之间的抽象关系。每个线程有自己的内存区域,存的是从主内存复制过来的变量副本,他是一个抽象概念。
线程之间通信会通过主内存,将修改的数据刷新到主内存去,其他线程就能够获取到。
===考虑到内存模型避不开指令重排序
为了提升性能,编译器和处理器都会做指令重排序。
指令重排序在单cpu和单线程条件下遵循一系列规则:
1.如果有数据依赖关系的比如先写再读,先读再写啥的就不做重排序;控制依赖关系的时候,会先缓存计算结果再等条件判断。
a = 1;
b = 1;
bool = true;
c = a + b;
if (bool) {
c = a * a;
}
2.保证结果不改变情况下重排序。
指令重排序在多线程情况下如果没做同步可能出现内存可见性问题。
happens before
java提供给程序员一种便于操作重排序的规则,就是happens before规则。他是一种表示可见性的规则,比如A happens before B,表示A的执行结果对B是可见的,但是没有要求A在B之前执行。
每个happens before规则都对应着底层的一系列重排序规则,我们不需要知道底层具体是怎么重排序的,相当于提供给我们一套更方便理解指令重排序的这么一套规则。