一、概要介绍

java内存模型,描述了java程序中各种变量(线程共享变量)的访问规则。以及在jvm中将变量存储到内存中读取出变量这样的底层细节。
规定一:线程对共享变量的所有操作,都是在自己的工作内存中完成,不能直接从主内存中获取。
规定二:不同线程直接无法直接访问他线程工作内存中的变量,必须通过借助主内存来完成。
二、指令重排序

定义:代码书写的顺序,与执行的顺序不一致,重排序是为了使编译器或处理器更高的效率执行程序。
1.编译器优化的重排序(编译器优化)
2.指令集并行的重排序(处理器优化)
3.内存系统的重排序(处理器优化)


三、共享变量可见性实现的原理。

线程1对共享变量的修改想要被线程2及时看到,必须经过如下步骤:
- 把工作内存1中更新的共享变量刷新到主内存中
- 把主内存中更新的变量情况,同步到工作内存2中
四、synchronized实现内存可见性
JMM关于synchronized的两条规定(保证线程在下次加锁前获取到的数据是最新的):
- 线程在解锁前,必须把共享变量的最新值,更新到主内存中去。
- 线程加锁时,将清空工作内存中共享变量的值从而使用从主内存中最新copy的最新副本数据。(特别注意:加锁和解锁必须是同一把锁)
synchronized实现可见性(实现互斥): 步骤一:获得互斥锁。 步骤二:清空工作内存。 步骤三:从主内存中copy最新的变量副本到工作内存。 步骤四: 执行代码。 步骤五:将工作内存中的修改的共享变量同步更新到主内存中。 步骤六:释放互斥锁。

五、volatile实现内存可见性
volatile关键字:
- 可以保证volatile变量的原子性
- 不能保证volatile变量符合操作的原子性


五、volatile不能保证原子性操作


六、volatile和synchronized的比较


