gpt4 book ai didi

java - 两次调用 Wea​​kHashMap.put(..) 背后的原因是什么?

转载 作者:行者123 更新时间:2023-12-02 09:43:08 26 4
gpt4 key购买 nike

这个blog post演示了一种实现每个字符串 id 互斥锁的方法。使用的字符串 ids 表示 HttpSession ids。

  1. 为什么我们需要在 Mutex 实例周围包裹一个 WeakReference ?从 String -> Mutex 创建一个 Map 不是更好吗?
  2. 为什么我们需要调用 put 两次?

    public Mutex getMutex( String id )
    {
    Mutex key = new MutexImpl( id );
    synchronized( mutexMap )
    {
    WeakReference<Mutex> ref = mutexMap.get( key );
    if( ref == null )
    {
    mutexMap.put( key, new WeakReference<Mutex>( key ) );
    return key;
    }
    Mutex mutex = ref.get();
    if( mutex == null )
    {
    mutexMap.put( key, new WeakReference<Mutex>( key ) );
    return key;
    }
    return mutex;
    }
    }

最佳答案

WeakHashMap 中的值对象由普通的强引用保存。因此,应注意确保值对象不会直接或间接强烈引用自己的键,因为这将防止键被丢弃。请注意,值对象可以通过 WeakHashMap 本身间接引用其键;也就是说,值对象可以强引用某个其他键对象,而该其他键对象的关联值对象又强引用第一个值对象的键。处理此问题的一种方法是在插入之前将值本身包装在 WeakReference 中,如: m.put(key, new WeakReference(value)),然后在每次获取时展开。

关于java - 两次调用 Wea​​kHashMap.put(..) 背后的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/823902/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com