volatile/final
2019-05-09 本文已影响0人
Wi1ls努力努力再努力
- 对于单个 volatile变量的读/写具有原子性;复合操作不具有原子性,如 volatile++。
- 对 volatile 的写操作会使 JVM 将该线程对应的本地内存中的共享变量刷新到主内存。
- 对 volatile 的 读操作,会使 JVM 将该线程对应的本地内存置为无效,强行从主内存读取共享变量。
- 为了实现 volatile 内存语义,JVM 会限制编译器重排序和处理器重排序
- 在构造函数内对一个 final 域的写入,与随后把这个被构造函数的引用赋值给一个引用变量,这两个操作之间不能重排序。
- JVM 禁止编译器把 final 域的写重排序到构造函数之外。
- 编译器会在 final 域的写之后,构造函数的 return 之前,插入一个 StoreStore 屏障,这个屏障禁止处理器把 final 域的写重排序到构造函数之外。
- 编译器会在读 final 域的操作前面插入一个 LoadLoad 屏障。
- 初次读一个包含 final 域的对象的引用,与随后初次读这个 final 域,这两个操作之间不能重排序。
- 在构造函数内对一个 final 引用的对象的成员域的写入,在随后在构造函数外把这个被构造函数对象的引用赋值给一个引用变量,这两个操作不能重排序。