Не делайте этого. Проблемы перевешивают преимущества.
Независимо от того, используете ли вы финализацию, эталонный API или Cleaner
(который основывается на эталонном API), попытка использовать жизненный цикл объекта для управления блокировкой создаст еще больше проблем.
Нет никакой гарантии, что объект когда-либо будет собирать мусор. Пока остается достаточно свободной памяти кучи, у JVM нет причин запускать сборщик мусора. Кроме того, даже когда сборщик мусора работает, нет гарантии, что он соберет все недоступные объекты. Сборщики мусора, такие как G1GC, сосредотачиваются на освобождении как можно большего объема памяти в заданные временные рамки, отдавая предпочтение эффекту над возрастом объекта. На самом деле им даже неизвестно, как долго валяется мертвый предмет.
Таким образом, конкретный недостижимый объект может оставаться несобранным в течение бесконечного времени, пока JVM довольна тем, что GC собирает кучу новых объектов.
Хуже того, объект может мусор, собранный раньше, чем ожидалось. Для явных действий по блокировке и разблокировке это не имеет значения, так как поведение программы остается прежним. Но когда вы связываете жизненный цикл объекта с действием разблокировки, вы у вас проблемы. Это особенно применимо, когда объект служит только для действий блокировки и разблокировки, а действие разблокировки было забыто программистом приложения, другими словами, объект блокировки полностью не используется после выполнения действия блокировки.
Чтобы предотвратить ранний сбор, вам нужно что-то вроде Reference.reachabilityFence(lockObject)
, но когда программист забывает выполнить требуемое действие разблокировки, насколько вероятно, что он не забудет вставить необходимое ограничение доступности ? Вместо этого им было бы проще вставить необходимое действие разблокировки.
Любая попытка решить эту проблему будет далеко не простой, но и не даст гарантий, которые стоили затраченных усилий. Вам лучше настоятельно напомнить пользователям вашего класса блокировки о необходимости его разблокировки. Рассмотрите возможность реализации AutoCloseable
и рекламировать его использование в try-with-resource.
person
Holger
schedule
30.06.2020
Cleaner API
, но только начиная с java-9. - person Eugene   schedule 30.06.2020