什麼是競態條件? 舉個例子說明。

一、什麼是競態條件?java

當兩個線程競爭同一資源時,若是對資源的訪問順序敏感,就稱存在競態條件this

競態條件(Race Condition):計算的正確性取決於多個線程的交替執行時序時,就會發生競態條件。線程

致使競態條件發生的代碼區稱做臨界區code

在臨界區中使用適當的同步就能夠避免競態條件。內存

臨界區實現方法有兩種,一種是用synchronized,一種是用Lock顯式鎖實現。資源

二、實例:get

class Counter { 
    protected long count = 0; 
    public void add(long value) { 
        this.count = this.count + value; 
    } 
} 

觀察線程A和B交錯執行會發生什麼,兩個線程分別加了2和3到count變量上,兩個線程執行結束後count變量的值應該等於5。然而因爲兩個線程是交叉執行的,兩個線程從內存中讀出的初始值都是0。而後各自加了2和3,並分別寫回內存。最終的值並非指望的5,而是最後寫回內存的那個線程的值同步

上面例子中最後寫回內存的是多是線程A,也多是線程B。若是沒有采用合適的同步機制,線程間的交叉執行狀況就沒法預料。
add()方法就是一個臨界區,它會產生競態條件。it

三、最多見的競態條件爲:io

先檢測後執行。

執行依賴於檢測的結果,而檢測結果依賴於多個線程的執行時序,而多個線程的執行時序一般狀況下是不固定、不可判斷的,從而致使執行結果出現各類問題。

 組合操做須要注意競態條件問題

相關文章
相關標籤/搜索