首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WeakHashMap和WeakReference

WeakHashMap和WeakReference
EN

Stack Overflow用户
提问于 2013-10-02 18:00:20
回答 1查看 281关注 0票数 0

如何自动清除instanceMap的键和值;当getInstance()接口返回的Conf对象被WeakHashMap和WeakReference垃圾回收时...?

代码语言:javascript
复制
//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;
        }         
    }
}
EN

回答 1

Stack Overflow用户

发布于 2013-10-02 18:09:07

如果您希望在丢弃密钥时进行清理,请使用WeakHashMap。如果你想丢弃一个值的清理,你需要自己做这件事。

代码语言:javascript
复制
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;
}

注意:这可能会使死键到处乱放。如果你不想要这个,你需要清理它们。

代码语言:javascript
复制
for(Iterator<WeakReference<Conf>> iter = instanceMap.values().iterator(); iter.hashNext() ; ) {
    WeakReference<Conf> ref = iter.next();
    if (ref.get() == null) iter.remove();
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19134401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档