執行緒安全問題的解決方案
阿新 • • 發佈:2022-03-11
執行緒安全問題的解決方案
條件:
- 多執行緒併發
- 有共享資料
- 共享資料有修改行為
滿足這些條件就會存線上程安全問題。怎麼解決這個安全問題呢!執行緒排隊執行,又稱執行緒同步機制。
執行緒同步機制就是執行緒排隊。這樣就不能併發了,會犧牲效率。
非同步就是併發 同步就是排隊
java中每一個物件都有一個物件鎖! 執行時,如果有synchronized並且屬於這個類,那麼執行這個方法時,這把鎖就會被標記,當同時有另外一個執行緒對該物件進行執行該方法的時候,就會等待標記被釋放,才能進入方法體!
執行緒同步機制語法 synchronized三種寫法
-
同步程式碼塊 靈活
//synchronized後面小括號中傳的這個資料“相當關鍵”。這個資料必須是多執行緒共享的資料,才能達到多執行緒排隊 synchronized (*.class){ //需要排隊的方法塊 }
-
在例項方法上使用 表示鎖的是this 並且同步程式碼塊是整個方法體
public synchronized void method(){ //方法快 }
-
在靜態方法上使用synchronized 類鎖 一個類一個鎖 一百個物件也只有一個類鎖
public synchronized static void method(){ //方法快 }
開發中怎麼解決執行緒安全問題?
第一步方案:儘量使用區域性變數代替“例項變數和靜態變數”。
第二種方案:如果必是實力變數,那麼可以考慮建立多個物件,這樣例項變數的記憶體就不再共享了。(一個吸納成對應一個物件,100個執行緒對應100個物件,物件不共享,就沒有資料安全問題了。)
第三種方案:如果不能使用區域性變數,物件也不能建立多個,就只能選擇synchronized了,執行緒安全同步機制。
使用synchronized方法的時候,考慮到效率,被synchronied包含的程式碼塊越少越好!
執行緒安全問題,主要似乎為了解決放在JVM堆區裡面的變數
三大變數:
實際變數(堆中),靜態變數(方法區),區域性變數(棧中)