第一部分:併發理論基礎12->面向物件思想寫好併發程式
阿新 • • 發佈:2021-07-01
面向物件思想寫併發程式
1. 封裝共享變數
面向物件封裝,
屬性和實現細節封裝在物件內部,外部通過公共方法簡介訪問內部屬性
將共享變數作為物件屬性封裝在內部,對外公共方法制定併發訪問策略
以計數器為例,共享變數value,將公共方法get和addOne宣告為同步方法,這樣就對共享變數的操作就變成了執行緒安全了
public class Counter { private long value; synchronized long get(){ return value; } synchronized long addOne(){ return ++value; } }
對於不會發生變化的共享變數,建議使用final修飾,效能還好。同時還能解決併發問題
2.識別共享變數間的約束條件
識別共享變數的約束條件很重要,約束條件,決定了併發訪問策略
public class SafeWM { // 庫存上限 private final AtomicLong upper = new AtomicLong(0); // 庫存下限 private final AtomicLong lower = new AtomicLong(0); // 設定庫存上限 void setUpper(long v){ upper.set(v); } // 設定庫存下限 void setLower(long v){ lower.set(v); } // 省略其他業務程式碼 }
庫存下限要小於庫存上限
3.指定併發訪問策略
- 避免共享,避免共享的技術主要利用執行緒本地儲存以及為每個任務分配獨立的執行緒
- 不變模式:java裡用的少,actor模式,csp模式
- 管程和其他同步工具,java領域萬能解決方案是管程,但很多特定場景,java併發包裡的讀寫鎖,併發容器等同步工具更好
4.注意事項
- 優先使用成熟的工具類,java sdk併發包裡提供了豐富的工具類,熟悉並掌握它們,而不是自己造輪子
2.迫不得已才使用低階的同步原語,synchronized,Lock,Semaphore等;這些雖然簡單,實際上一定要小心使用
3.避免過早優化,安全第一,併發程式首先保證安全,出現效能瓶頸後再優化