簡體   English   中英

Java並發可見性

[英]Java concurrency visibility

我對Java的可見性有疑問。 僅當我們至少有兩個線程在至少2個cpu內核上運行時,才能顯示可見性。 是這樣嗎? 每個內核都可以在其代理服務器和緩存中緩存變量,因此,可能會出現可見性問題。 但是,如果我們有n個線程並且它們都在一個cpu內核上運行(當然,我們無法確定它們將僅在1個內核上運行,但假設有可能實現),那該怎么辦呢?有內存可見性嗎? 還是這不對? 提前致謝。

即使在運行多個線程的1個內核上,您仍然會遇到所謂的“可見性”問題,因為從內存中將值加載到寄存器中的線程會將此值保存到該線程的堆棧中,並且在以下情況下看不到更新:線程被關閉,然后再次打開, 除非變量/內存被聲明為volatile

如果通過可見性引用共享內存,那么在一個線程中創建或更改的對象可能在另一個線程中可見,那么不管有多少個內核,可見性將保持不變。 Java根據Java語言規范 (特別是Java內存模型)做出承諾,無論有多少內核,都必須遵守。

但是,如果我們有n個線程並且它們都在一個cpu內核上運行(當然,我們無法確定它們將僅在1個內核上運行,但假設有可能實現),那該怎么辦呢?有內存可見性嗎? 還是這不對?

是的,如果在一個內核上運行n個線程,可見性(共享內存)仍然存在。 但是,無論有多少核心,都存在一些警告。 主要是每個線程都有自己的緩存內存,並且兩個線程中的變量可能具有不同的值。 如果變量是volatile ,那么該變量的值將始終在所有線程中更新。

字段可以聲明為volatile,在這種情況下,Java內存模型可確保所有線程看到的變量值都是一致的(第17.4節)。

我建議您閱讀有關Java內存模型的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM