package com.zqh.singleton; import java.util.Vector; /** * http://www.ibm.com/developerworks/cn/java/l-singleton/ * */ public class GlobalConfig { private static GlobalConfig instance; private Vector properties = null; private boolean isUpdating = false; private int readCount = 0; private GlobalConfig() { //Load configuration information from DB or file Set values for properties } private static synchronized void syncInit() { if (instance == null) { instance = new GlobalConfig(); } } public static GlobalConfig getInstance() { if (instance==null) { syncInit(); } return instance; } // 单例对象的属性更新同步 //---------------------------------------------- // 读者/写者的处理方式 // 设置一个读计数器,每次读取配置信息前,将计数器加1,读完后将计数器减1。 // 只有在读计数器为0时,才能更新数据,同时要阻塞所有读属性的调用 public synchronized void update(String p_data) { syncUpdateIn(); //Update properties properties.set(0, p_data); } private synchronized void syncUpdateIn() { while (readCount > 0) { try { wait(); } catch (Exception e) { } } } private synchronized void syncReadIn() { readCount++; } private synchronized void syncReadOut() { readCount--; notifyAll(); } public Vector getProperties() { syncReadIn(); //Process data syncReadOut(); return properties; } //---------------------------------------------- // 影子实例: 在更新方法中,通过生成新的GlobalConfig的实例,从文件或数据库中得到最新配置信息,并存放到properties属性中 public Vector getProperties2() { return properties; } public void updateProperties() { //Load updated configuration information by new a GlobalConfig object GlobalConfig shadow = new GlobalConfig(); properties = shadow.getProperties(); } }