1. 硬件层的内存屏障:Load Barrier 和 Store Barrier
作用:阻止屏障两侧的指令重排序;
强制把写缓冲区/高速缓存中的脏数据等写回主内存,让缓存中相应的数据失效。
对于Load Barrier来说,在指令前插入Load Barrier,可以让高速缓存中的数据失效,强制从新从主内存加载数据;
对于Store Barrier来说,在指令后插入Store Barrier,能让写入缓存中的最新数据更新写入主内存,让其他线程可见。
2. volatile内存语义
当对一个volatile变量进行写操作的时候,JMM会把该线程对应的本地内存中的共享变量的值刷新到主内存中。
当读一个volatile变量的时候,JMM会把该线程对应的本地内存设置为无效,要求线程从主内存中读取数据。
3. volatile的实现
根据volatile重排序规则,在写操作前面插入Store Store屏障;在写操作后面插入storeload屏障;在读操作后面插入loadload和loadstore屏障
(基于保守策略)
4. 锁的内存语义
锁释放与volatile写语义相同。锁获取与volatile读语义相同。
5. 锁的底层实现
依靠volatile变量和cas操作实现。
6. final域内存语义
在对象引用为任意线程可见之前,对象的final域已经被正确初始化过,而普通域不具有这个保证。
7. final域重排序规则
final域是基础数据类型:
在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。
初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。
Final域是引用数据类型:
在构造函数内对一个final引用的对象的成员域的写入,与随后在构造函数外把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。