如何自动清除instanceMap的键和值;当getInstance()接口返回的Conf对象被WeakHashMap和WeakReference垃圾回收时...?
//single conference instance per ConferenceID
class Conf {
private static HashMap<String, Conf> instanceMap = new HashMap<String, Conf>;
/*
* Below code will avoid two threads are requesting
* to create conference with same confID.
*/
public static Conf getInstance(String confID){
//This below synch will ensure singleTon created per confID
synchronized(Conf.Class) {
Conf conf = instanceMap.get(confID);
if(conf == null) {
conf = new Conf();
instanceMap.put(confID, conf);
}
return conf;
}
}
}发布于 2013-10-02 18:09:07
如果您希望在丢弃密钥时进行清理,请使用WeakHashMap。如果你想丢弃一个值的清理,你需要自己做这件事。
private static final Map<String, WeakReference<Conf>> instanceMap = new HashMap<>;
/*
* Below code will avoid two threads are requesting
* to create conference with same confID.
*/
public static synchronized Conf getInstance(String confID){
//This below synch will ensure singleTon created per confID
WeakReference<Conf> ref = instanceMap.get(confID);
Conf conf;
if(ref == null || (conf = ref.get()) == null) {
conf = new Conf();
instanceMap.put(confID, new WeakReference<Conf>(conf));
}
return conf;
}注意:这可能会使死键到处乱放。如果你不想要这个,你需要清理它们。
for(Iterator<WeakReference<Conf>> iter = instanceMap.values().iterator(); iter.hashNext() ; ) {
WeakReference<Conf> ref = iter.next();
if (ref.get() == null) iter.remove();
}https://stackoverflow.com/questions/19134401
复制相似问题