Для чего используются WeakReferences, Weakashmaps, softreferences?

Пожалуйста, объясните, для чего используются WeakReferences. Обычно я разбираюсь в концепциях Java, но этот вызывает у меня затруднения.

Я понимаю, что такое WeakReferences, но их использование и природа немного расплывчаты в моей голове. Я не могу представить правильный сценарий, в котором использование WeakReferences становится необходимостью.

Я также знаю, что WeakHashMap связан с WeakReferences, где строка, содержащая нулевой ключ, автоматически удаляется. Я не могу себе представить, как это может быть, что у меня где-то есть WeakHashMap, и какой-то другой процесс аннулирует ключ, а затем WeakHashMap спасает положение, удаляя эту строку.

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

Если кто-то может придумать сценарий и дать мне некоторое понимание этого, я был бы очень благодарен.


person Muhammad Ahmed AbuTalib    schedule 20.10.2013    source источник
comment
В разделе Когда сильные ссылки слишком сильные этой статьи описывается несколько сценариев, в которых слабые ссылки полезны...   -  person Oliver Charlesworth    schedule 20.10.2013
comment
Чтобы получить ответ здесь, пожалуйста, задайте конкретный практический вопрос. Какую проблему вы можете решить с помощью этих классов?   -  person bmargulies    schedule 20.10.2013


Ответы (1)


Слабые ссылки в основном используются, когда вы не хотите, чтобы объект «прилипал», если на него никто не указывает. Один очень распространенный вариант использования, который, как мне кажется, помогает при размышлении о слабых ссылках, — это использование слабой хеш-карты для поддержания канонического отображения.

Рассмотрим случай, когда вам нужно поддерживать сопоставление между экземпляром Class<?> и списком всех методов, которые он содержит. Учитывая, что JVM вполне способна к динамической загрузке и выгрузке классов, вполне возможно, что класс, который у вас есть в вашей карте в качестве ключа, больше не нужен (на него больше ничего не указывает). Теперь, если бы вы использовали «сильную» ссылку для поддержки сопоставления класса с методом, ваш класс будет оставаться до тех пор, пока ваша карта доступна, что не является хорошей позицией в этом случае. Что вам действительно нужно, так это то, что если нет живых ссылок на ваш «класс», его следует отпустить по карте. Именно для этого и используется слабая хеш-карта.

EDIT: я бы рекомендовал указать этот поток для чтения.

person Sanjay T. Sharma    schedule 20.10.2013