模式4-Balking
参考《java多线程设计模式》
当警戒条件不成立就马上中断。
// 若有资料修改,就存储到挡安里 public synchronized void save() throws IOException { if (!changed) { System.out.println(Thread.currentThread().getName() + " balks"); return; } doSave(); changed = false; }
// 若有资料修改,就存储到挡安里 删除synchronized方法,并延长时间加大错误出现的机会。 public void save() throws IOException { if (!changed) { System.out.println(Thread.currentThread().getName() + " balks"); return; } doSave(); try{ Thread.sleep(100); }catch(InterruptedException e){ } changed = false; }
结果:有重复写入。
SaverThread calls doSave, content = No.0 ChangerThread balks SaverThread calls doSave, content = No.1 ChangerThread balks ChangerThread calls doSave, content = No.2 SaverThread calls doSave, content = No.2 ChangerThread balks ChangerThread calls doSave, content = No.4 SaverThread calls doSave, content = No.4 ChangerThread balks ChangerThread calls doSave, content = No.6 SaverThread calls doSave, content = No.7 ChangerThread balks ChangerThread calls doSave, content = No.8 SaverThread calls doSave, content = No.9 ChangerThread balks ChangerThread calls doSave, content = No.10
设置timeout,如果过了timeout时间,警戒条件没有满足,就抛出异常:
private static final long TIMEOUT = 30000;
public synchronized Request getRequest() { long start = System.currentTimeMillis(); // 开始时间 while (queue.size() <= 0) { long now = System.currentTimeMillis(); //现在时间 long rest = TIMEOUT - (now - start); //剩下时间 if (rest <= 0) { throw new LivenessException("thrown by " + Thread.currentThread().getName()); } try { wait(rest); } catch (InterruptedException e) { } } return (Request)queue.removeFirst(); }