我剛剛跑過an article,它提出了我以前從未聽說過的聲明,並且找不到其他任何地方。聲明是從另一個線程的角度來看,構造函數返回的值的賦值可能會根據構造函數中的指令進行重新排序。換言之,聲明是在下面的代碼中,另一個線程可能會讀取一個非空值a
,其中x
的值尚未設置。構造函數和指令重新排序
class MyInt {
private int x;
public MyInt(int value) {
x = value;
}
public int getValue() {
return x;
}
}
MyInt a = new MyInt(42);
這是真的嗎?
編輯:
我認爲這是保證從線程執行MyInt a = new MyInt(42)
的角度來看,x
分配有之前發生與a
的分配關係。但是這兩個值都可以緩存在寄存器中,並且它們可能不會按照它們最初寫入的順序刷新到主內存。如果沒有內存屏障,另一個線程可以在寫入x
的值之前讀取a
的值。正確?
因此根據axtavt的回答以及後面的評論,這些線程安全評估是否正確?
// thread-safe
class Foo() {
final int[] x;
public Foo() {
int[] tmp = new int[1];
tmp[0] = 42;
x = tmp; // memory barrier here
}
}
// not thread-safe
class Bar() {
final int[] x = new int[1]; // memory barrier here
public Bar() {
x[0] = 42; // assignment may not be seen by other threads
}
}
如果這是正確的......哇,這是非常微妙的。
where'MyInt a = new MyInt(42);'located? –
呃...我不知道。如果這有所作爲,你能否詳細解答一下答案? –