Balking Pattern重在“balking”,balking的意思是“退缩不前”,在棒球运动的意思是“当跑垒员在垒时,投手在投手板但’中途放弃‘投球的动作”(呵呵,对棒球不懂...)。另外,这种模式和Guarded Suspension Pattern有点类似,也是有要检测警戒条件是否成立,不过,如果不成立,就不用等待了,直接就放弃了。呵呵,这种模式还是想的比较开啊(不行?那爷不赔你玩了:)),相比之下,Guarded Suspension Pattern就执着的多了:)。 从代码的角度看,如下: class A{ public synchronized void guardedMethod(){ if(警戒条件不成立){ return; } 进行处理 改变状态 } } 下面给出参考书中列出的一个使用Balking Pattern的实例:即文本编辑器的自动保存功能。当在编辑文件的时候,后台有个线程会定期的对文件进行保存,防止程序崩溃时文件内容的丢失。那么,文件是否被修改就是这里的警戒条件。当然,还得有另外一个字段,就是当前的数据。编辑程序会调用synchronized的方法对文件数据进行修改,并设置警戒条件(为什么用synchronized?是因为防止更改操作和保存的冲突,否则,可能保存的不是最新的数据)。那么,后台的定时保存线程,会定时调用保存文件这个guardedMethod(),如果文件已经被(编辑程序)保存了,那么就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的适用场合:
- 不需要可以去执行的时候。如上面说的自动保存的例子。
- 不想等待警戒条件成立时。
- 警戒条件只有一次成立时。比如仅仅需要进行一次初始化(不是在构造函数中)的共享资源类。
参考: 《Java多线程设计模式》,中国铁道出版社,2005,结城浩
文章来源:
http://localhost/wp2/?p=86