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






