1
private final Point p;
void synchronized setPoint(int x, int y) {
p.x=x;
p.y=y;
}
Point getPoint() {
return p;
}
讓我們假設一些A類有最後的參考字段點p。JVM可以緩存對象的字段嗎?
Point p對象是在A類構造函數中創建的。
類A需要是線程安全的,所以有一個同步的setter setPoint來改變p的內部字段。
由於引用p是final,所以我們不需要在多線程環境中讀取引用本身。但是對象的內部數據呢?
JVM可以將p的內部數據存儲在任何正在運行的線程的緩存中嗎?
一般來說,JVM是否將數據從堆(而不是堆棧)存儲到緩存?如果是這樣,那麼應該如何處理這樣的字段,因爲volatile關鍵字隻影響引用本身而不引用對象?還是可以離開吸氣劑並且沒有可見性問題?
快速回答:在讀取數據時也使用同步。只有同步集合纔會導致線程錯誤。 –