java并发编程的艺术---重排序与volatilefinal关键字

Posted 星期天去哪玩o

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java并发编程的艺术---重排序与volatilefinal关键字相关的知识,希望对你有一定的参考价值。

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

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

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

final 的重排序:

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

以上是关于java并发编程的艺术---重排序与volatilefinal关键字的主要内容,如果未能解决你的问题,请参考以下文章

并发编程的艺术

Java 并发编程线程指令重排序问题 ( 指令重排序规范 | volatile 关键字禁止指令重排序 )

Java 并发编程 -- 并发编程线程基础(线程安全问题可见性问题synchronized / volatile 关键字CASUnsafe指令重排序伪共享Java锁的概述)

Java 并发编程 -- 并发编程线程基础(线程安全问题可见性问题synchronized / volatile 关键字CASUnsafe指令重排序伪共享Java锁的概述)

并发艺术--java内存模型

并发编程-Java内存模型和volatile