線程安全(精簡)

線程安全問題

線程安全問題本質上就是內存安全問題安全

每一個進程中都會有一塊特殊的區域(堆內存),進程中全部線程均可以訪問該區域,這是線程安全問題的緣由之一。併發

線程安全指的是,在堆內存中的數據因爲能夠被全部線程訪問到,在沒有限制措施的條件下存在被意外修改的風險。spa


解決方式

一、操做系統會給每一個線程分配私有空間(棧內存),棧內存中的數據只能被線程自己訪問,其餘線程無權訪問,所以能夠將可能會發生線程安全的數據放到棧內存中,常見的是在程序中定義爲局部變量。操作系統

  優勢:安全線程

  缺點:局部變量訪問權限變小進程

二、將數據放在公共區域(堆內存)中,當每一個線程使用時都拷貝一份數據在本身的棧內存中,只操做本身棧內存中的數據。也就是使用ThreadLocal類。內存

  優勢:安全資源

  缺點:*變量

三、將公共區域的數據使用final關鍵字修飾,這樣線程只能讀取,不能修改。權限

  優勢:安全

  缺點:只能讀,不能改

四、將數據放在堆內存中,每一個線程在獲取到數據的使用權時,對該數據加互斥鎖,其餘線程看見數據被鎖住只能選擇等待,當線程使用完畢數據後,釋放鎖,其餘線程才能繼續搶奪數據的使用權(悲觀鎖)。

  優勢:安全

  缺點:獲取鎖釋放鎖須要消耗資源

五、CAS(Compare And Swap):假設程序併發量很小,形成線程安全的問題的機率也很小,可使用CAS方式,規定一個版本號,若是A線程操做數據未操做完畢就去作其餘工做(此時版本號爲2),回來後版本號若是改變就從新從頭開始操做,不然就繼續完成剩下的工做。(樂觀鎖)

  優勢:省去了釋放鎖獲取鎖的資源消耗

  缺點:不適用於併發量大的程序。

相關文章
相關標籤/搜索