2014-07-24 6 views
0

Недавно я попытался понять java.util.WeakHashMap.Почему объект WeakReferenced не удаляется WeakHashMap

Но когда я использую WeakReference для обертывания строки, WeakHash не завершает запись.

Также обратите внимание, что я очищаю WeakReference в основном потоке, прежде чем он будет передан внутри метода потока.

При исполнении, в то время как петля вообще не ломается!

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(); 

    } 
} 

ответ

1

Струны, которые вы используете в настоящее время проводятся в бассейне интернированных строк, попробуйте следующее:

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

Этого интернирование эффект описан в Java Language Spec

Кроме того, строковую всегда ссылается на тот же экземпляр класса String. Это связано с тем, что строковые литералы - или, более общо, строки , которые являются значениями константных выражений (§15.28) - «интернированы» , чтобы обмениваться уникальными экземплярами, используя метод String.intern.

+0

Спасибо, Крис. Я получил недостающий бит сейчас :) – Maas

2

Обертывание WeakReference вокруг строки постоянной не будет работать. Строковые константы интернированы, что означает, что ссылка никогда не исчезнет. Кроме того, ваш код сохраняет ссылку на одну и ту же константу в вашем методе запуска, что еще больше гарантирует сильную ссылку.

+0

Строковые константы * всегда * интернированные. Это требуется JLS. – EJP

Смежные вопросы