2012-08-24 30 views
1

我從mailing list郵件它說,如果揮發性瓦爾行動包含數據爭再保證(「A計劃是否能正確同步,當且僅當所有順序一致的執行都是免費的數據競爭。」在JLS)不能應用。爲什麼我們不能應用JLS中包含的保證?

爲了方便,我只是把的orginal content部分在這裏:

我有一個使用volatile變量的程序,我試圖來思考它使用「A計劃是否能正確同步,當且僅當所有順序一致的執行都沒有數據競爭。「在JLS3中保證。

JLS3似乎包含毛刺,防止我從證明我的計劃是免費的數據競爭。具體來說,考慮在同步順序中R之後的易失性變量V的讀取R和V的寫入W。 JLS3似乎認爲R和W是相沖突的訪問。而且, 從R到W之前沒有發生 - 之前的邊緣(以及如此)。因此,JLS3似乎也認爲R和W構成了數據競賽。最後,似乎因此我不能適用上述保證。

所以這是我的問題:如果對易失性變量的操作包含數據競爭,爲什麼我們不能應用JLS中包含的保證?

+0

這不是一個保證,這是一個定義,並明確排除了你所描述的情況。不是一個真正的問題。 – EJP

+1

的答案給出爲[在該消息(http://www.cs.umd.edu/~pugh/java/memoryModel/archive/2482.html)=>有在數據競爭的定義中的錯誤,其允許這樣做,但它不應該是這種情況(即使用volatile變量應該可以防止數據競爭,但現在的JMM措辭並不總是這種情況)。 – assylias

+0

@assylias令人困惑的是,這一事實已爲OP所熟知。 –

回答

2

甲順序一致的執行包含易失性的寫入前於揮發性

=>

執行讀取包含數據種族

=>

程序不「正確同步「

=>

JLS不提供適用於正確同步程序的保證。

+0

Marko Topolnik,謝謝你的回答。我不知道我的理解是否正確,如果不正確,請更正它: 因爲「只在線程之間共享volatile變量的程序不可能包含數據競爭」,「程序)包含對易失性寫入之前的易失性讀取「仍然是正確同步程序的執行,但根據數據競爭的當前定義,」執行包含數據競爭「,所以」程序不是「正確同步「」。 – newman

+0

由於根據上述保證和數據競爭的當前定義,我們可以得出一個相反的結論,「似乎我不能應用上述保證。」 – newman

+0

不存在任何矛盾,但**精神**和**信件**之間的衝突:*信*說共享揮發性變量的程序**不正確同步**; *精神*顯而易見,它**正確同步**。 –

相關問題