内存屏障、volatile、锁、final

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引用的对象的成员域的写入,与随后在构造函数外把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。

猜你喜欢

转载自blog.csdn.net/jzlcheng/article/details/79962835