Roh*_*hit 7 java multithreading
我正在浏览有关Thread和Locks的JLS文档http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.5.
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; // guaranteed to see 3
int j = f.y; // could see 0
}
}
}
Run Code Online (Sandbox Code Playgroud)
我对上面提到的关于fy如何被视为零的例子(前17.5-1)感到困惑.Reader Threads将对象f读取为null,在这种情况下它不会执行任何操作,或者它将通过一些引用读取对象f.如果对象f有引用,则构造函数必须已完成其执行,即使多个Writer线程正在运行,以便可以将引用分配给f,如果构造函数已执行,则应将fy视为4.
在什么条件下可以fy = 0?
谢谢
在什么条件下可以fy = 0?
Java内存模型允许JIT编译器重新排序构造函数外部的非最终字段的初始化.该字段是最终的,因此必须由JVM初始化,但不是最终的.因此,有可能分配和设置,但字段的初始化尚未完成.x
y
FinalFieldExample
static FinalFieldExample f
y
引用17.5-1:
因为writer方法在对象的构造函数完成后写入f,所以读者方法将保证看到fx的正确初始化值:它将读取值3.但是,fy不是final; 因此,读者方法不能保证看到它的值4.
因为f.y
不是最终的,所以不能保证在构造函数完成和static f
分配时已经设置了它.所以有一个竞争条件被创建,reader
可能会看到y
3或0取决于这个种族.
归档时间: |
|
查看次数: |
164 次 |
最近记录: |