2017-04-18 29 views
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關鍵字隻影響引用本身而不引用對象?還是可以離開吸氣劑並且沒有可見性問題?

JVM confusing schema on this topic

+4

快速回答:在讀取數據時也使用同步。只有同步集合纔會導致線程錯誤。 –

回答

1

您的問題有點過於籠統。
什麼是JVM?其中有很多,也有很多不同的版本。我很熟悉HotSpot和OpenJDK JVM(我已經讀過他們代碼的大部分內容),並且它們都不會打擾「緩存」對象,因爲大多數流行的CPU本身已經更高效地執行它了。

如果您從不同線程讀取或寫入任何共享數據,請將該字段(或字段)與​​關鍵字同步。它將確保可視性和正確的內存排序。

相關問題