談談對“競態條件”和“數據競爭”的理解

在《JAVA併發編程實戰》中提到兩個術語:"競態條件"和"數據競爭"。
當時確實沒看懂這兩個東西有啥區別,我覺得最大的問題在於作者用雞蛋去解釋雞蛋的原因,聽完之後好像聽了一段繞口令,哦,原來是這樣,但我還是沒聽懂。
這兩個術語很難分清,要知道把事情理解錯了比不知道這件事情更可怕。所以花了些時間在網上去看別人是怎麼理解和解釋這兩個術語的。
有些人用"原子性-競態條件"和"可見性-數據競爭"來區分,但是越講,越讓我覺得這兩個東西是一個東西了。
我自己花了些時間總結了一下,還請各位看看總結的是否正確。
兩個術語表述的意思都是在多個線程操作同一個資源的時候,可能會導致最後的結果與預期結果不一致的問題。
但是兩個術語針對的受影響的對象是不一樣的。
競態條件:強調的是被操作的資源A在被對象B操作完之後,其結果與預期的結果不一樣。此時受影響的對象是被操作的資源A,並不關心操作資源的對象B是否受到此資源的影響。
比如兩個線程A和B對一個數據a進行"++a"操作,如果一個線程B是在另一個線程A操作完之後再取到的數據a,則a的最終結果是正確的。如果A的操作還未完成之前,B就取到a的值並對其進行修改,那麼a的最終結果與預期不符。這裏就競態條件。
數據競爭:強調的是訪問資源B的對象A在訪問資源B的時候取到錯誤的數據而出現錯誤的結果。此時受影響的對象是操作資源B的對象A,而不關心資源B本身是否是正確的。
比如一個線程A在修改數據a,此時線程B不知道線程A在修改數據a,並在修改還未完成的情況下取到了a的值並進行別的計算,此時B其實取到的就是錯誤的值,但是數據a本身沒有錯誤。這裏就是數據競爭。
由此看來,兩者針對的對象並不一樣,但是在同樣的環境下也可能會有"競態條件"和"數據競爭"同時出現的情況。
比如在上面競態條件的例子中,如果A和B還有後續操作依賴於a的值,那麼兩種情況就同時出現了,因爲不僅a的值與預期不符,而且A與B的後續計算也會因爲取得錯誤的數據而受到影響。
當然,被操作的資源可以是基本數據類型,也可以是引用數據類型。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章