java并发编程的艺术(二)---重排序与volatile、final关键字

重排序:是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。

当数据依赖的时候不允许产生重排序,多线程有些情况下重排序会影响语义。

volatile 定义的的对象内存对多线程之间是立马可见的,他建立了先写后读happens-before关系,常用来在多线程中进行flag标志位的判断,当A线程写入volatile变量时,会立马刷新值到主内存并且同时通知B线程修改消息,B线程中读取该对象值时会被jvm中的线程内存标记为无效再去读取一次。

final 的重排序:

  1. 在构造函数内对一个 final 域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。
  2. 初次读一个包含 final 域的对象的引用,与随后初次读这个 final 域,这两个操作之间不能重排序。

猜你喜欢

转载自www.cnblogs.com/wengshuhang/p/10200383.html