在JAVA語言里,面向對象思想能夠讓并發編程變得更簡單。
可以從封裝共享變量,識別共享變量間的約束條件和執行并發訪問策略這三個方面下手。
封裝共享變量
將共享變量作為對象屬性封裝在內部,對所有公共方法指定并發訪問策略。
對于不用發生變化的共享變量(如銀行卡號,身份證號),建議使用final關鍵字修飾。
public class Counter { private long value; synchronized long get(){ return value; } synchronized long addOne(){ return ++value; } }
識別共享變量間的約束條件
/** * AtomicLong 是線程安全的 */ public class SafeWM { // 庫存上限 private final AtomicLong upper = new AtomicLong(0); // 庫存下限 private final AtomicLong lower = new AtomicLong(0); // 設置庫存上限 void setUpper(long v){ //檢查參數合法性 if(v < lower.get()){ throw new IllegalArgumentException(); } upper.set(v); } // 設置庫存下限 void setLower(long v){ //檢查參數合法性 if(v > upper.get()){ throw new IllegalArgumentException(); } lower.set(v); } // 省略其他業務代碼 }
制定并發訪問策略
- 避免共享: 利用線程本地存儲以及每個認為u分配獨立的線程。
- 不變模式:在java領域應用的很少。
- 管程及其他同步工具:Java領域萬能的解決方案是管程,但是對于很多特定場景,使用Java并發包提供的 讀寫鎖、并發容器等同步工具會更好。
寫出健壯的并發程序的原則
- 有限使用成熟的工具類:java SDK并發包里提供了豐富的工具類,能滿足日常需求。
- 迫不得已時才使用低級的同步原語:低級同步原語指的是synchronized,Lock,Semaphore等。
- 避免過早優化: 安全第一,并發成語首先要保證安全,出現性能瓶頸后再優化。