balking
其实我们发现多线程中balking pattern 和 Guarded Suspension pattern 很相像,但是其实是里面不同,对于 Guarded Suspension pattern模式中 可能会有多个线程都去获取资源,通过保护区,资源不够的时候就不执行当前线程使线程等待,等资源够了就可以使用等待的线程了。所以 Guarded Suspension pattern 的线程每个都是希望执行方法的,而balking中只希望有一个线程执行了就可以了,并不希望有多个线程执行。(考虑好这个问题,不够线程优先级特定的情况下会有问题,需要仔细考虑,现在考虑的是公平锁情况下)
public class SaveThread extends Thread{
private Data data;
public SaveThread(String name,Data data) {
super(name);
this.data=data;
}
public void run(){
try{
while(true){
data.save();
Thread.sleep(1000);
}
}catch(IOException |InterruptedException a){
}
}
}
//指定修改
public class ChangeThread extends Thread {
private Data data;
public ChangeThread(String name,Data data) {
super(name);
this.data=data;
}
public void run(){
try{
for(int i=0;;i++){
data.change("no."+i);
Thread.sleep(300);
data.save();
}
}catch(IOException| InterruptedException e){
}
}
}
public class Data {
private final String fileName;
private boolean changed;
private String content;
public Data(String filename, String content) {
this.fileName = filename;
this.content = content;
}
public synchronized void change(String newContent) {
content = newContent;
changed = true;
}
public synchronized void save() throws IOException {
if (!changed) {
return;
}
doSave();
changed = false;
}
public void doSave() throws IOException {
System.out.println(Thread.currentThread().getName()
+ " calls doSave, content = " + content);
Writer writer = new FileWriter(fileName,true);
writer.write(content);
writer.close();
}
}
public class Main {
public static void main(String args[]){
Data data=new Data("data.txt","empty");
new ChangeThread("change", data).start();
new SaveThread("save", data).start();
}
}
打印的结果是: no.0no.1no.2no.3no.4no.5no.6no.7no.8no.9no.10no.11no.12no.13no.14no.15no.16no.17no.18no.19no.20no.21no.22no.23
线程之间有竞争,又只希望其中一个获胜 balking pattern 就可以安心使用了。