【Java并发编程系列4】final

主要讲解final的内存语义和使用方式。
前言
看这篇文章前,建议先看完《Java并发编程系列1-基础知识》,因为相关知识有很强的依赖,这篇文章也是Java内存模型JMM相关文章的最后一篇。
final禁止指令重排分析
该部分内容基本摘抄自《深入理解Java内存模型》,仅加入自己的总结,更详细讲解可以直接参考此书。
对final域的读和写更像是普通的变量访问,编译器和处理器要遵守两个重排序规则:
- 在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。
- 初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。
下面,我们通过一些示例性的代码来分别说明这两个规则:
public class FinalExample {
int i; //普通变量
final int j; //final变量
static FinalExample obj;
public void FinalExample () { //构造函数
i = 1; //写普通域
j = 2; //写final域
}
public static void writer () { //写线程A执行
obj = new FinalExample ();
}
public static void reader () { //读线程B执行
FinalExample object = obj; //读对象引用
int a = object.i; //读普通域
int b = object.j; //读final域
}
}
这里假设一个线程A执行writer ()方法,随后另一个线程B执行reader ()方法,注意两者的调用先后关系!
下面我们通...
1 条评论
回复