一、簡述
競态條件(Race Condition):計算的正确性取決于多個線程的交替執行時序時,就會發生競态條件。
二、常見競态條件分析
最常見的競态條件為
1.先檢測後執行
執行依賴于檢測的結果,而檢測結果依賴于多個線程的執行時序,而多個線程的執行時序通常情況下是不固定不可判斷的,進而導緻執行結果出現各種問題。

對于main線程,如果檔案a不存在,則建立檔案a,但是在判斷檔案a不存在之後,Task線程建立了檔案a,這時候先前的判斷結果已經失效,(main線程的執行依賴了一個錯誤的判斷結果)此時檔案a已經存在了,但是main線程還是會繼續建立檔案a,導緻Task線程建立的檔案a被覆寫、檔案中的内容丢失等等問題。
多線程環境中對同一個檔案的操作要加鎖。
2.延遲初始化(最典型即為單例)
public class ObjFactory {
private Obj instance;
public Obj getInstance(){
if(instance == null){
instance = new Obj();
}
return instance;
}
}