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的适用场合:

  1. 不需要可以去执行的时候。如上面说的自动保存的例子。
  2. 不想等待警戒条件成立时。
  3. 警戒条件只有一次成立时。比如仅仅需要进行一次初始化(不是在构造函数中)的共享资源类。

参考: 《Java多线程设计模式》,中国铁道出版社,2005,结城浩


文章来源:http://localhost/wp2/?p=86