Слабые ссылки в Java

Слабые ссылки в Java

1. обзор

В этой статье мы рассмотрим концепцию слабой ссылки в языке Java.

Мы собираемся объяснить, что это такое, для чего они используются и как с ними правильно работать.

2. Слабые ссылки

Объект, на который имеется слабая ссылка, очищается сборщиком мусора, когда он недоступен.

Слабая достижимость означает, чтоobject has neither strong nor soft references pointing to it. Объект может быть достигнут только путем обхода слабой ссылки.

Во-первых, сборщик мусора очищает слабую ссылку, поэтому референт больше не доступен. Затем ссылка помещается в очередь ссылок (если она существует), откуда мы можем получить ее.

В то же время, ранее слабодоступные объекты будут доработаны.

3. Случаи применения

Как указано в документации Java,weak references are most often used to implement canonicalizing mappings. Отображение называется канонизированным, если оно содержит только один экземпляр определенного значения. Вместо создания нового объекта он ищет существующий в отображении и использует его.

Конечно,most known use of these references is the WeakHashMap class. Это реализация интерфейсаMap, в котором каждый ключ хранится как слабая ссылка на данный ключ. Когда сборщик мусора удаляет ключ, объект, связанный с этим ключом, также удаляется.

Для получения дополнительной информации посетитеour guide to WeakHashMap.

Другая область, где они могут быть использованы, -the Lapsed Listener problem.

Издатель (или субъект) содержит сильные ссылки на всех подписчиков (или слушателей), чтобы уведомить их о событиях, которые произошли. The problem arises when a listener can’t successfully unsubscribe from a publisher.с

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

Решением проблемы может быть субъект, имеющий слабую ссылку на наблюдателя, позволяющий первому собирать мусор без необходимости отмены подписки (обратите внимание, что это не полное решение, и оно вводит некоторые другие проблемы, которые не здесь).

4. Работа со слабыми ссылками

Слабые ссылки представлены классомjava.lang.ref.WeakReference. Мы можем инициализировать его, передавая параметр в качестве параметра. При желании мы можем предоставитьjava.lang.ref.ReferenceQueue:

Object referent = new Object();
ReferenceQueue referenceQueue = new ReferenceQueue<>();

WeakReference weakReference1 = new WeakReference<>(referent);
WeakReference weakReference2 = new WeakReference<>(referent, referenceQueue);


Референт ссылки может быть получен методомget и удален вручную с помощью методаclear:

Object referent2 = weakReference1.get();
weakReference1.clear();

Шаблон для безопасной работы с такими ссылками такой же, как и сsoft references:

Object referent3 = weakReference2.get();
if (referent3 != null) {
    // GC hasn't removed the instance yet
} else {
    // GC has cleared the instance
}

5. Заключение

В этом кратком руководстве мы рассмотрели низкоуровневую концепцию слабой ссылки в Java и сосредоточились на наиболее распространенных сценариях их использования.