Balking Pattern重在“balking”,balking的意思是“退縮不前”,在棒球運動的意思是“當跑壘員在壘時,投手在投手板但’中途放棄‘投球的動作”(呵呵,對棒球不懂...)。另外,這種模式和Guarded Suspension Pattern有點類似,也是有要檢測警戒條件是否成立,不過,如果不成立,就不用等待了,直接就放棄了。呵呵,這種模式還是想的比較開啊(不行?那爺不賠你玩了:)),相比之下,Guarded Suspension Pattern就執(zhí)著的多了:)。 從代碼的角度看,如下: class A{ public synchronized void guardedMethod(){ if(警戒條件不成立){ return; } 進行處理 改變狀態(tài) } } 下面給出參考書中列出的一個使用Balking Pattern的實例:即文本編輯器的自動保存功能。當在編輯文件的時候,后臺有個線程會定期的對文件進行保存,防止程序崩潰時文件內(nèi)容的丟失。那么,文件是否被修改就是這里的警戒條件。當然,還得有另外一個字段,就是當前的數(shù)據(jù)。編輯程序會調(diào)用synchronized的方法對文件數(shù)據(jù)進行修改,并設置警戒條件(為什么用synchronized?是因為防止更改操作和保存的沖突,否則,可能保存的不是最新的數(shù)據(jù))。那么,后臺的定時保存線程,會定時調(diào)用保存文件這個guardedMethod(),如果文件已經(jīng)被(編輯程序)保存了,那么就balking了,否則,就保存。下面是代碼:
class Data{
public synchronized void changeData(String content){
this.content = content; changed = true;
}
public synchronized void guardedMethod(){
if(!changed){ return; }
doSave();
changed = false;
}
private vodi doSave(){}
}
注意上面的doSave方法不是synchronized。 Balking Patter的適用場合:
- 不需要可以去執(zhí)行的時候。如上面說的自動保存的例子。
- 不想等待警戒條件成立時。
- 警戒條件只有一次成立時。比如僅僅需要進行一次初始化(不是在構造函數(shù)中)的共享資源類。
參考: 《Java多線程設計模式》,中國鐵道出版社,2005,結(jié)城浩
文章來源:
http://localhost/wp2/?p=86