在這樣一個例子:在同步塊內訪問的變量是否必須聲明爲volatile?
...
public void foo() {
...
synchronized (lock) {
varA += some_value;
}
...
}
...
的問題是,不翻必須聲明,以防止每線程緩存揮發性或它足以僅在同步塊訪問它?
謝謝!
在這樣一個例子:在同步塊內訪問的變量是否必須聲明爲volatile?
...
public void foo() {
...
synchronized (lock) {
varA += some_value;
}
...
}
...
的問題是,不翻必須聲明,以防止每線程緩存揮發性或它足以僅在同步塊訪問它?
謝謝!
不,你不需要。
塊意味着記憶障礙。
從JSR-133:
但是,還有更多的比的同步互斥。同步確保線程在同步塊之前或期間寫入的內存以可預測的方式顯示給在同一監視器上同步的其他線程。在我們退出一個同步塊之後,我們釋放監視器,將緩存刷新到主內存,以便該線程所做的寫入對其他線程可見。在我們輸入一個同步塊之前,我們需要獲取監視器,這會導致本地處理器緩存失效,從而使變量從主內存中重新加載。然後,我們將能夠看到之前版本中可見的所有寫入。
只要每次訪問都來自一個同步塊內,那麼你很好。
存在與每個同步塊關聯的內存屏障,這將確保內部訪問的變量正確顯示。