簡體   English   中英

Java - 易變性和可見性

[英]Java - volatile and visibility

據我所知,volatile背后的潛在機制保證不對操作進行重新排序。 但是我很難看到它如何保證可見性。

即線程A寫入一個值。 然后線程B從內存中讀取它,而不是從緩存中讀取它(以保證緩存一致性)。 我知道CAS確實如此,但是內存屏障是如何實現這一目標的呢?

易失性“使用”硬件特定指令來實現它。 這是關於JSR-133和編譯器編寫器的內存障礙的深入文章

我知道CAS確實如此,但是如何實現這一目標?

因為如果你在AtomicInteger尋找例子,你會看到

private volatile int value;

內存屏障由CPU實現,以始終顯示最新值。 沒有CPU支持就無法實現這一點。

一種常見的誤解是訪問是主內存,但這將是非常緩慢的。 相反,L2緩存之間存在緩存一致性總線。

在L1高速緩存之前有一個寫入存儲緩沖區,但CPU確保高速緩存行在核心之間是當前的。

通用內存屏障是特定於CPU的指令,它表示“使讀取緩存無效”或“提交寫入緩存”,或兩者兼而有之。 在像x86這樣的強排序CPU上,“使讀取緩存無效”是一種無操作,因為緩存始終是連貫的。

暫無
暫無

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

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