Руководство по Java Core. Коллекции. WeakHashMap.

Класс WeakHashMap является реализацией интерфейса Map, который хранит только слабые ссылки в качестве ключей. Это позволяет сборщику мусора удалять элемент структуры в том случае, если на ключ элемента типа “ключ – значение” за пределами таблицы никто не ссылается.

Этот класс крайне полезен, если нам необходимо сразу удалять значение, когда оно становится недоступным для других процессов (в условиях ограниченности физических ресурсов). Например, при учёте активных пользователей.

Тут стоит остановиться и кратко объяснить, как JVM работает со слабой ссылкой (weak reference).

Если на объект ссылается только слабая ссылка, он будет удалён при первом же вызове сборщика мусора. Что и позволяет нам избежать OutOfMemoryError.

С конструкторами и метода этого класса Вы можете ознакомиться в официальной документации.

Для понимания того, как это работает на практике, рассмотрим пример простого приложения.

Пример:

Класс WeakHashMapDemo


import java.util.Map;
import java.util.WeakHashMap;

public class WeakHashMapDemo {
    private static Map map;

    public static void main(String[] args) {
        map = new WeakHashMap<>();
        map.put(new Integer(1), "Proselyte");

        Runnable runner = new Runnable() {
            @Override
            public void run() {
                while (map.containsKey(1)){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("Thread is waiting...");
                    System.gc();
                }
            }
        };

        Thread thread = new Thread(runner);
        thread.start();
        System.out.println("Application is waiting...");
        try {
            thread.join();
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}

В результате работы программы мы получим, следующий результат:


/*Some System Messages*/

Application is waiting...
Thread is waiting...

В этом разделе мы изучили основы класса WeakHashMap и рассмотрели пример простого приложения с его использованием.