Слабые ссылки - насколько они полезны?

Так что в последнее время я обдумывал некоторые идеи автоматического управления памятью - в частности, я рассматривал реализацию диспетчера памяти, основанного на подсчете ссылок. Конечно, всем известно, что циклические ссылки убивают наивный подсчет ссылок. Решение: слабые ссылки. Лично я ненавижу использовать слабые ссылки таким образом (есть и другие, более интуитивные способы решения этой проблемы, через определение цикла), но это заставило меня задуматься: где еще может быть полезна слабая ссылка?

Я полагаю, что она должна по какой-то причине они существуют, особенно в языках с трассировкой сборки мусора, которые не страдают от ловушки циклических ссылок (C # и Java - это те, с которыми я знаком, а в Java даже есть три вида слабых ссылок!). Однако, когда я попытался найти для них надежные варианты использования, у меня в основном возникли идеи вроде «Используйте их для реализации кешей» (я видел это несколько раз на SO). Мне это тоже не нравится, поскольку они полагаются на тот факт, что сборщик мусора, скорее всего, не соберет объект сразу после того, как на него больше не будут ссылаться, за исключением ситуаций с нехваткой памяти. Такие случаи абсолютно недопустимы для GC с подсчетом ссылок, поскольку объект уничтожается сразу после того, как на него больше не ссылаются (за исключением, возможно, случая циклов).

Но это действительно заставляет меня задуматься: как может быть полезна слабая ссылка? Если вы не можете рассчитывать на то, что он ссылается на объект, и он не нужен для таких вещей, как прерывание циклов, тогда зачем использовать один?

34
задан ParkerHalo 20 December 2017 в 09:34
поделиться