競態條件(Race Condition):計算的正確性取決於多個線程的交替執行時序時,就會發生競態條件。html
最多見的競態條件爲編程
執行依賴於檢測的結果,而檢測結果依賴於多個線程的執行時序,而多個線程的執行時序一般狀況下是不固定不可判斷的,從而致使執行結果出現各類問題。安全
對於main線程,若是文件a不存在,則建立文件a,可是在判斷文件a不存在以後,Task線程建立了文件a,這時候先前的判斷結果已經失效,(main線程的執行依賴了一個錯誤的判斷結果)此時文件a已經存在了,可是main線程仍是會繼續建立文件a,致使Task線程建立的文件a被覆蓋、文件中的內容丟失等等問題。多線程
多線程環境中對同一個文件的操做要加鎖。併發
public class ObjFactory { private Obj instance; public Obj getInstance(){ if(instance == null){ instance = new Obj(); } return instance; } }
線程a和線程b同時執行getInstance(),線程a看到instance爲空,建立了一個新的Obj對象,此時線程b也須要判斷instance是否爲空,此時的instance是否爲空取決於不可預測的時序:包括線程a建立Obj對象須要多長時間以及線程的調度方式,若是b檢測時,instance爲空,那麼b也會建立一個instance對象post
和大多數併發錯誤同樣,競態條件不老是會產生問題,還須要不恰當的執行時序
3、解決措施url