Я работаю над созданием ссылки на автообновление в Java.
Вариант использования Существуют неизменяемые объекты, которые должны быть лениво инициализированы, включая статические объекты.Эти объекты будут иметь пики вызовов, поэтому простой вызов поставщика каждый раз для (эффективно) одного и того же объекта будет бесполезным.Но удержание объекта несколько согласованно для больших объектов для классов, которые могут храниться в загрузчике классов гораздо дольше, чем может потребоваться значение.В то же время, вариант использования также включает многопоточные приложения с длительным сроком службы;поэтому простого SoftReference или WeakReference недостаточно, потому что они не являются поточно-ориентированными (я смотрю на исходный код версии 1.8, где оба наследуют и напрямую используют поля и методы Reference (без переопределения), где не используется изменяемое синхронизированное ключевое слово,ни каких-либо очевидных атомарных протоколов).
tl: dr вариант использования Это сводится к тому, что объект должен позволять сборщику мусора очистить значение, но будучи поточно-ориентированным.Единственный способ включить сборщик мусора, удерживая значение (насколько мне известно), это использовать SoftReference или WeakReference;оба из которых не являются поточно-ориентированными.
Я стараюсь избегать использования синхронизированных методов получения / установки и энергозависимого ссылочного типа;мы можем обеспечить безопасность потоков с помощью блокировок, чтобы блокировать другие потоки, и надежных ссылок для блокировки сборщика мусора.Основной проблемой здесь является тот факт, что блоки стоят дорого.
Другие варианты включают класс Atomic Reference, который рассматривается как используемый в сочетании с Soft или Weak Reference.Либо завершенная, но мутирующая ссылка AtomicReference, содержащая Soft / Weak Reference, либо изменчивая Soft / Weak Reference, содержащая AtomicReference с синхронизированными блоками, что противоречит цели использования AtomicReference.Таким образом, иметь как атомные, так и мягкие / слабые ссылки - значит, чтобы атомные держали мягкие / слабые ссылки.Однако наличие AtomicReference удерживает Soft / Weak Reference, возможно, не имеет видимости в памяти до конечного значения, потому что Soft / Weak is не обязательно гарантирует это?
tl: dr сообщение Будет лиAtomicReference, содержащий мягкую или слабую ссылку, на самом деле имеет видимость памяти, даже если у класса Reference нет прямого страхования видимости памяти?Таким образом, эффективно обеспечивает тот же уровень безопасности потоков, что и более дорогостоящая комбинация volatile и блокировок?