天天看點

Java并發之多線程下競态條件概念的了解

一、簡述

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

二、常見競态條件分析

最常見的競态條件為

1.先檢測後執行

執行依賴于檢測的結果,而檢測結果依賴于多個線程的執行時序,而多個線程的執行時序通常情況下是不固定不可判斷的,進而導緻執行結果出現各種問題。

Java并發之多線程下競态條件概念的了解

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