考慮下面的玩具例子:Java,與主內存的同步僅對同步塊或所有實例變量中的變量發生?
public class Test {
private int nr;
private A a;
public synchronized A getA() {
return a;
}
public synchronized void setA(A a) {
this.a = a;
}
public static class A{
B b;
}
public static class B{
// may contain other references
}
}
由於同步關鍵字都在的get/set,我們可以安全地讀/寫「一」從多個線程。我們不需要聲明它是volatile,因爲在同步塊的開始/結束處,本地緩存線程與主內存的同步已完成。
但是,基本上我們正在同步'this',Test對象也包含變量'nr'。 Java是否與主內存同步,關於set/get'a',只發生在'a'上,因爲它是在這些同步塊或者Test類的所有成員中訪問的唯一變量,因爲我們已經同步了'this 「?另外,當發生與主存儲器的同步時,是否是遞歸的,也就是說'a'可能包含的所有引用鏈(在本例中爲'b')是從主存儲器讀取還是隻讀?
謝謝
理論上,只有a是同步的,儘管在實踐中nr不可能同步。 – assylias
@assylias我認爲該陳述是不正確的。如果兩個線程在同一個對象上同步,則所有寫入nr的內容都將保證可見。 – Ishtar
Similar questions:http://stackoverflow.com/questions/6611109/how-will-the-following-java-program-run-in-the-happens-before-order-example'X'對應'nr'和'Y'到'this.a' – Ishtar