[url]http://www.cs.umd.edu/users/pugh/java/memoryModel/jsr-133-faq.html#finalRight[/url]
这是 JSR-133 关于 final 的说明。其中,第一个例子 FinalFieldExample 如下:
[code="java"]
class FinalFieldExample {
final int x;
int y;
static FinalFieldExample f;
public FinalFieldExample() {
x = 3;
y = 4;
}
static void writer() {
f = new FinalFieldExample();
}
static void reader() {
if (f != null) {
int i = f.x;
int j = f.y;
}
}
}
[/code]
然后,作者解释说
1、执行reader的线程[b]保证可以看到f.x为3[/b],因为x定义为final;
2、[b]不保证f.y为4[/b],因为f.y[color=red][b]未[/b][/color]定义为 final
但是,真的是这样吗?为什么 f.y有可能不为4能,难道就是因为 “调用writer()的线程 thread-locally cache了 y 的值,从而导致其他线程看不到y的值”
我写个测试程序,无论如何也无法得到f.y不为4的情况
[code="java"]
public class FinalFieldExample {
final int x;
int y;
static FinalFieldExample f;
public FinalFieldExample() {
x = 3;
y = 4;
}
static void writer() {
f = new FinalFieldExample();
}
static void reader() {
while (f != null) {
int i = f.x;
int j = f.y;
if (j != 4) {
System.out.println("j should be 4");
}
if (i != 3) {
System.out.println("i should be 3");
}
}
}
public static void main(String[] args) {
class WriteThread extends Thread {
public void run() {
FinalFieldExample.writer();
}
}
class ReadThread extends Thread {
public void run() {
FinalFieldExample.reader();
}
}
new WriteThread().start();
for (int i = 0; i < 100; i++) {
new ReadThread().start();
}
}
}
[/code]
也就是理论上存在这种可能吧。现实中,谁能写个测试程序,使得我们可以看到 f.y不等于 4??