... и в этом вся суть.Слабые ссылки полезны, если вы не хотите (или не можете себе позволить) сохранять объект в памяти неопределенно долго.Рассмотрим следующий вариант использования: вам нужно связать информацию с классами.Теперь, когда вы работаете в среде, где классы могут быть перезагружены (скажем, в среде Tomcat или OSGi), вы хотите, чтобы сборщик мусора мог восстанавливать старые версии класса, как только это будет безопасно..
Первоначальная попытка реализовать это может выглядеть следующим образом:
class ClassAssoc {
private final IdentityHashMap<Class<?>,MyMetaData> cache = new ...;
}
Проблема здесь такова: при этом все классы в элементе cache
будут сохраняться вечно (или, по крайней мере, если ониудаляются вручную), заставляя сборщик мусора сохранять их неопределенно долго, включая все, на что ссылается класс (статические значения членов, информация о загрузчике класса, ...)
Используя слабые ссылки, сборщик мусора может вернуть старыйверсия класса, как только нет других ссылок на него (обычно экземпляры).С другой стороны: до тех пор, пока такие ссылки существуют, гарантируется, что значение также будет достигнуто из слабого ссылочного объекта, и, таким образом, является допустимым ключом в таблице кэша.
Добавление параллелизма и других злодеяний вкартинка, и вы находитесь на том, что MapMaker
опционально также обеспечивает ...