Предисловие
Эта статья пытается изучить слабые ссылки на Java с точки зрения того, что, почему и как помочь всем понять определения, основные сценарии использования и методы использования слабых ссылок на Java.
1. Что-какая слабая цитата?
Слабые ссылки в Java конкретно относятся к классу java.lang.ref.WeakReference<T> . Давайте сначала посмотрим на официальную документацию, объясняет это:
Существование слабого эталонного объекта не предотвращает переработанную коллекцию мусора. Наиболее распространенным использованием слабых ссылок является реализация канонизации сопоставлений (таких как хэш -таблицы).
Предполагая, что коллекционер мусора решает, что объект является слабо достойным в определенный момент времени (то есть все текущие указы на него являются слабыми ссылками), сборщик мусора очистит все слабые ссылки на объект, а затем отмечают слабый достижимый объект как окончательный, так что он будет переработан позже. В то же время или позже, сборщик мусора поместит недавно очищенные слабые ссылки в справочную очередь, указанные при создании слабого эталонного объекта.
Фактически, в Java есть четыре типа ссылок, которые от сильных до слабых: сильная ссылка , мягкая ссылка , слабая ссылка и виртуальная ссылка .
Ниже мы кратко представляем три других ссылок, помимо слабых цитат:
1. Сильная ссылка: обычно ссылка, которую мы возвращаем, когда создаем новый объект через новый, является сильной ссылкой. Если объект может быть достигнут через серию сильных ссылок, он полностью достижимы, то он не будет переработан.
2. Мягкая ссылка: разница между мягкой ссылкой и слабым эталоном заключается в том, что если объект достижимы с помощью слабой ссылки, он будет переработан независимо от того, является ли текущая память достаточной, в то время как объект, достижимый мягким эталом, будет переработана только тогда, когда память недостаточно. Следовательно, мягкие ссылки «сильнее», чем слабые ссылки.
3. Призрачная ссылка: виртуальная ссылка - самая слабая ссылка на Java, так насколько это слаб? Это настолько хрупко, что мы не можем даже получить ссылочный объект с помощью виртуальных ссылок. Единственная цель виртуальных ссылок состоит в том, что когда объект, на который он указывает, переработан, сама виртуальная ссылка будет добавлена в справочную очередь и используется для записи того, что объект, на который он указывает, был переработан.
2. Почему-то
Рассмотрим следующий сценарий: в настоящее время есть класс Product , который представляет продукт, который предназначен для того, чтобы быть не масштабируемым, и в настоящее время мы хотим добавить число в каждый продукт. Одним из решений является использование HashMap<Product, Integer> . Так что проблема возникает. Если нам больше не нужен объект Product , который должен существовать в памяти (например, этот продукт был продан), предполагая, что ссылка на него является productA , мы назначим значение productA как null . Однако в настоящее время объект Product , на который указывает productA в прошлом, не будет переработан, потому что на него явно ссылается HashMap . Таким образом, в этом случае, если мы хотим по -настоящему переработать объект Product , недостаточно просто назначить его сильную ссылку на null , и нам также необходимо удалить соответствующую запись из HashMap . Очевидно, мы не хотим выполнять работу «Удаление больше не необходимых записей из HashMap ». Мы хотим сообщить коллекционеру мусора: только key в HashMap ссылается на объект Product , соответствующий объект Product может быть переработан. Очевидно, что, основываясь на предыдущем определении слабых цитат, использование слабых цитат может помочь нам достичь этой цели. Нам просто нужно использовать слабый эталонный объект, указывающий на объект Product в качестве key в HashMap .
3. Как-как использовать слабые ссылки?
Возьмите сценарий, представленный выше в качестве примера. Мы используем слабый эталонный объект, указывающий на объект Product в качестве key HashMap , и просто определяем этот слабый эталонный объект, как это:
Продукт продукт = новый продукт (...); SleedReference <Продукт> SleedProducta = new SleedReference <> (Producta);
Теперь, если объект weakProductA ссылается, он указывает на Product productA . Итак, как мы можем получить Product Product productA , на который он указывает на weakProduct ?
Это очень просто, просто нужен следующий код:
Продукт продукта = SleedProducta.get ();
На самом деле, для этого случая библиотека классов Java предоставляет нам класс WeakHashMap . Используя этот класс, его ключ, естественно, является слабым эталонным объектом, и нам больше не нужно вручную обернуть исходный объект. Таким образом, когда productA становится null (он указывает на то, что Product который он ссылается, больше не требуется Product чтобы существовать в памяти), Product эталонный объект является weakProductA , тогда, очевидно, соответствующий объект Product слаб и может быть достигнут в настоящее время, поэтому слабая ссылка, указывающая на него
4. Справочная очередь
Давайте кратко представим концепцию цитирования очередей. На самом деле, класс WeakReference имеет два конструктора:
// Создать слабую ссылку на заданный объект SleadReference (T REGURE) // Создать слабую ссылку на заданный объект и регистрирует слабую ссылку на данную ссылку.
Мы видим, что второй конструктор обеспечивает параметр типового ReferenceQueue . Предоставляя этот параметр, мы регистрируем созданный слабый эталонный объект в очереди на справочную очередь. Таким образом, когда он очищается коллекционером мусора, он будет отправлен в справочную очередь, и мы можем управлять этими чистыми слабыми эталонными объектами единым образом.
5. Резюме
Ну, содержание этой статьи заканчивается здесь. Из -за ограниченного личного уровня в повествовании неизбежно существуют неточные или неясные аспекты. Я надеюсь, что вы сможете указать это, спасибо за поддержку wulin.com.