基礎概念:什麼叫競態條件?

轉自:https://www.cnblogs.com/xiaozhijing/p/7919216.html

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

導致競態條件發生的代碼區稱作臨界區。

在臨界區中使用適當的同步就可以避免競態條件。

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

eg 來自網址:http://cuisuqiang.iteye.com/blog/2020152

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()方法就是一個臨界區,它會產生競態條件。

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