1. 程式人生 > 其它 >執行緒安全問題的解決方案

執行緒安全問題的解決方案

執行緒安全問題的解決方案

條件:
  • 多執行緒併發
  • 有共享資料
  • 共享資料有修改行為

滿足這些條件就會存線上程安全問題。怎麼解決這個安全問題呢!執行緒排隊執行,又稱執行緒同步機制

執行緒同步機制就是執行緒排隊。這樣就不能併發了,會犧牲效率。

非同步就是併發 同步就是排隊

java中每一個物件都有一個物件鎖! 執行時,如果有synchronized並且屬於這個類,那麼執行這個方法時,這把鎖就會被標記,當同時有另外一個執行緒對該物件進行執行該方法的時候,就會等待標記被釋放,才能進入方法體!

執行緒同步機制語法 synchronized三種寫法

  • 同步程式碼塊 靈活

    //synchronized後面小括號中傳的這個資料“相當關鍵”。這個資料必須是多執行緒共享的資料,才能達到多執行緒排隊
    synchronized (*.class){
    	//需要排隊的方法塊
    }
    
  • 在例項方法上使用 表示鎖的是this 並且同步程式碼塊是整個方法體

    public synchronized void method(){
    	//方法快
    }
    
  • 在靜態方法上使用synchronized 類鎖 一個類一個鎖 一百個物件也只有一個類鎖

    public synchronized static void method(){
        //方法快
    }
    

開發中怎麼解決執行緒安全問題?

第一步方案:儘量使用區域性變數代替“例項變數和靜態變數”。

第二種方案:如果必是實力變數,那麼可以考慮建立多個物件,這樣例項變數的記憶體就不再共享了。(一個吸納成對應一個物件,100個執行緒對應100個物件,物件不共享,就沒有資料安全問題了。)

第三種方案:如果不能使用區域性變數,物件也不能建立多個,就只能選擇synchronized了,執行緒安全同步機制。

使用synchronized方法的時候,考慮到效率,被synchronied包含的程式碼塊越少越好!

執行緒安全問題,主要似乎為了解決放在JVM堆區裡面的變數

三大變數:

實際變數(堆中),靜態變數(方法區),區域性變數(棧中)