2014-10-09 162 views
0

從Java併發的運作volatile變量VS實例變量

線程共享其所屬進程的內存地址空間,所有 一個進程中的線程可以訪問相同的變量& 分配對象來自同一堆。

另外

聲明變量爲線程不應該緩存 這種可變或者換句話說不應該相信這些 變量的值,除非它們被直接從主存儲器讀出的揮發性裝置。

我的問題是

說有「A」是由一個線程修改非易失性實例變量。 'a'的修改值不會在堆上更新。如果它在堆上更新,則讀取該實例變量的另一個線程將自動讀取更新的值,因爲線程共享堆中的實例變量。那麼volatile變量的功能如何不同呢?

回答

3

區別在於volatile變量是強制在讀取之前從所有緩存刷新並且所有讀取來自主存儲器。

一個非volatile變量可以在所有線程中多次緩存。

本質

  • 每次閱讀它擁有最新的寫入它從任何線程值一volatile變量

  • 每次閱讀一個non-volatile變量它擁有最新的寫入它從這個線程值只有可能有其他線程寫的值。

在這是問題的最常見的原因很可能對一個線程寫入值的變量和第二線程從未特定情況下看到了新的價值。

+0

那麼,在讀寫緩存甚至是實例變量的時候線程呢? – underdog 2014-10-09 13:37:13

+1

@underdog - 他們**可以** - 他們實際上並不需要,而且他們通常不會,但臨界點是您不能採取任何方式。 – OldCurmudgeon 2014-10-09 13:38:29

+0

@OldCurmudgeon你能解釋一下「他們實際上不需要」嗎? – Prakash 2014-10-09 13:48:13