Java併發之多線程下競態條件概念的理解

1、簡述

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

2、常見競態條件分析

最多見的競態條件爲編程

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;
    }
}

 

線程a和線程b同時執行getInstance(),線程a看到instance爲空,建立了一個新的Obj對象,此時線程b也須要判斷instance是否爲空,此時的instance是否爲空取決於不可預測的時序:包括線程a建立Obj對象須要多長時間以及線程的調度方式,若是b檢測時,instance爲空,那麼b也會建立一個instance對象post

和大多數併發錯誤同樣,競態條件不老是會產生問題,還須要不恰當的執行時序
3、解決措施url

Java併發編程(七):線程安全策略spa

相關文章
相關標籤/搜索