Balking模式讲的是如果现在不合适执行这个操作,或者没必要执行这个操作,就停止处理,直接返回
自动保存功能的实现逻辑一般都是隔一定时间自动执行存盘操作,存盘操作的前提是文件做过修改,如果文件没有执行过修改操作,就需要快速放弃存盘操作
public class Data { private final String filename; // 保存的文件名称 private String content; // 数据内容 private Boolean changed;// 修改后的文件尚未保存时,为true public Data(String filename, String content) { this.filename = filename; this.content = content; this.changed = true; } // 修改数据内容 public synchronized void change(String newContent) { content = newContent; changed = true; // 为了表示content字段内容与文件内容不一致,未修改状态 } // 若数据内容修改过,则保存到文件中 public synchronized void save() throws IOException { if (!changed) { return; } doSave(); changed = false; // 为了表示content字段内容与文件内容一致,未修改状态 } private 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 ChangerThread extends Thread { private final Data data; private final Random random = new Random(); public ChangerThread(String name, Data data) { super(name); this.data = data; } public void run() { try { for (int i = 1; i<=10; i++) { data.change("No." + i); // 修改数据 Thread.sleep(random.nextInt(1000)); // 执行其他操作 data.save(); // 显示地保存 } } catch (InterruptedException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } public class SaverThread extends Thread { private final Data data; public SaverThread(String name, Data data) { super(name); this.data = data; } public void run() { try { while (true) { data.save(); // 要求保存数据 Thread.sleep(1000); // 休眠约1秒 } } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } } public class Main { public static void main(String[] args) { Data data = new Data("C:\Users\Administrator\Desktop\abc.txt", "emtity"); new ChangerThread("ChangerThread", data).start(); new SaverThread("SaverThread", data).start(); } }
单次初始化
class InitTest{ boolean inited = false; synchronized void init(){ if(inited){ return; } // 省略 doInit 的实现 doInit(); inited=true; } }