wikipedia 上有一個很棒的表格,非常清楚的說明 race condition 的概念
以下表格引用自 wikipedia : http://en.wikipedia.org/wiki/Race_condition
狀況一 : Thread 1 & Thread 2 依序執行, 得到一個正確的運算結果
Thread 1 | Thread 2 | Integer value | |
---|---|---|---|
0 | |||
read value | ← | 0 | |
increase value | 0 | ||
write back | → | 1 | |
read value | ← | 1 | |
increase value | 1 | ||
write back | → | 2 |
狀況二 : Thread 1 & Thread 2 同時執行, Thread 2 的運算結果覆蓋掉 Thread 1 的運算結果, 最終得到一個錯誤的值
Thread 1 | Thread 2 | Integer value | |
---|---|---|---|
0 | |||
read value | ← | 0 | |
read value | ← | 0 | |
increase value | 0 | ||
increase value | 0 | ||
write back | → | 1 | |
write back | → | 1 |
因此在多執行緒的程式中使用 lock 來避免產生 race condition
在 Java 中使用 lock 的兩個主要作用
- mutex : 建立 critical section, 避免 race condition
- visibility : 維持記憶體一致(memory consistency)
0 comments:
Post a Comment