概述
多个线程监控某个共享变量,A线程监控到共享变量发生变化后即将触发某个动作,但是此时发现有另外一个线程B已经针对该变量开始了行动,因此A放弃了准备开始的动作,我们把这样的线程间交互称为Balking(犹豫)设计模式。
比如,我们在用文档编辑时,每次的文字编辑都代表文档的状态发生了改变,除了我们可以手动保存文档之外,word软件本身也会定期触发自动保存。如果word自动保存文档的线程正准备执行保存动作时,恰巧我们手动进行了保存,那么自动保存文档的线程将会放弃这次的保存动作。
Document
public class Document {
private boolean changed;
private String content;
public Document(String content) {
this.changed = false;
this.content = content;
}
public synchronized void change() {
this.changed=true;
}
public synchronized void save() {
if(!changed) {
return;
}
doSave();
this.changed=false;
}
private void doSave() {
System.out.println(Thread.currentThread().getName()+":Save");
try {
//模拟业务逻辑
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
测试类
public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InterruptedException {
Document document = new Document("Reyco");
Thread writer =new Thread() {
@Override
public void run() {
document.change();
}
};
Thread saver1 =new Thread() {
@Override
public void run() {
document.save();
}
};
Thread saver2 =new Thread() {
@Override
public void run() {
document.save();
}
};
writer.start();
saver1.start();
saver2.start();
}