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