0

我最近尝试了解 java.util.WeakHashMap。

但是当我使用 Wea​​kReference 包装一个字符串时,WeakHash 并没有最终确定条目。

另请注意,在线程方法中引用它之前,我正在清除主线程中的 WeakReference。

执行时,while 循环根本不会中断!

public class WeakHashMapTotorial
{
    private static Map<String, String> map;

    public static void main(String args[])
    {
        WeakReference<String> s = new WeakReference<String>("Maine");
        map = new WeakHashMap<>();
        map.put(s.get(), "Augusta");

        Runnable runner = new Runnable()
        {
            public void run()
            {
                while (map.containsKey("Maine"))
                {
                    try
                    {
                        Thread.sleep(1000);
                    } catch (InterruptedException ignored)
                    {}
                    System.out.println("Thread waiting");
                    System.gc();
                }
            }
        };
        Thread t = new Thread(runner);
        t.start();
        System.out.println("Main waiting");
        try
        {
            t.join();
        } catch (InterruptedException ignored)
        {}
        s.clear();

    }
}
4

2 回答 2

2

将 a 包裹WeakReference在 String 常量周围是行不通的。字符串常量是实习的,这意味着引用永远不会消失。此外,您的代码在您的 run 方法中保留对相同常量的引用,进一步保证强引用仍然存在。

于 2014-07-24T11:07:33.927 回答
1

您正在使用的字符串由实习字符串池保存,请尝试以下操作:

    WeakReference<String> s = new WeakReference<String>(new String("Maine"));
    map = new WeakHashMap<>();
    map.put(s.get(), "Augusta");

Java 语言规范中描述了这种实习效果

此外,字符串字面量总是引用 String 类的同一个实例。这是因为字符串字面量 - 或者更一般地说,作为常量表达式值的字符串(第 15.28 节) - 是“内部的”,以便使用 String.intern 方法共享唯一实例。

于 2014-07-24T11:07:53.083 回答