這個Q正在尋找關於Java如何使volatile
字段可見的具體細節。Java如何管理易失性字段的可見性?
Java中的volatile
關鍵字用於在完成對其的寫入操作後,使該變量的讀者「主動」可見的變量。這是發生之前關係的一種形式 - 使得寫入結果暴露給訪問該變量的內存位置以供某些用途的人。並且在使用時,對該變量進行讀/寫操作原子 - 對於long
& double
- 對於其他所有var類型的R/W已經是原子。
我期待找出Java那樣做一個變量的值寫入操作後看到什麼呢?
例如:下面的代碼是從this討論其中一個答案:
public class Foo extends Thread {
private volatile boolean close = false;
public void run() {
while(!close) {
// do work
}
}
public void close() {
close = true;
// interrupt here if needed
}
}
讀取和刻錄布爾文字是原子。如果調用上述方法close()
,它是一個原子操作來設置的close
值作爲true
即使未聲明爲volatile
。
更何況volatile
在此代碼做的是確保更改這個值被認爲是它發生的那一刻。
究竟如何volatile
是實現這一目標?
通過對volatile變量優先與操作的線程?如果是這樣 - 在線程調度中如何執行,或者通過使讀取操作的線程查找標誌來查看是否有寫入器線程掛起?我知道「寫入一個易失性字段發生在每次後續讀取該字段之前」。它是否在線程中進行選擇,在給只讀的線程提供CPU時間之前,它對volatile變量有一個寫操作?
如果這是在線程調度級別(我懷疑)中進行管理,那麼在易失性字段上運行寫入線程會比看起來效果更大。
究竟是如何被管理的Java變量volatile
的知名度?
TIA。
它保證一個線程寫入到volatile變量將寫入主存儲器,並而不是處理器緩存,並且讀取volatile變量值的線程不會從處理器緩存中讀取,而是從主存儲器中讀取。我不是這些低級硬件機制的專家, LL讓專家回答,但你應該明白我的意思,與調度或優先級無關。 – 2014-10-05 16:55:37
的CPU完成所有的工作。在JVM確保它使用了正確的指示。 – 2014-10-05 17:36:01