Когда использовать фантомные ссылки в Java?

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

Но когда я прочитал о фантомных ссылках, я не мог их толком понять. Может быть, потому, что я не смог найти хороших примеров, показывающих, в чем их назначение и когда их использовать.

Не могли бы вы показать мне несколько примеров кода, в которых используется фантомная ссылка?


person hqt    schedule 22.03.2012    source источник
comment
Или, возможно: stackoverflow.com/questions/1599069/   -  person Brendan Long    schedule 22.03.2012
comment
Краткий ответ: почти нет приложений, кроме использования его как лучшего и более безопасного подхода к финализации, чем переопределение finalize.   -  person Louis Wasserman    schedule 22.03.2012
comment
@LouisWasserman, не могли бы вы привести мне подробный пример, пожалуйста. Я надеюсь увидеть это. спасибо :) (просто дайте мне, как использовать фантомную ссылку вместо завершения)   -  person hqt    schedule 22.03.2012
comment
Я изучаю использование ссылок Phantom в проекте JOGL для автоматического удаления буферов, текстур и т. д., которые были созданы в видеопамяти, когда они больше не используются. Хотя объект Java, которому выделена видеопамять, может собирать мусор, а выделенная им память — нет, ее необходимо освобождать вручную. Переопределение метода finalize() объекта не будет работать, потому что GL недоступен в любое время; однако фиктивная ссылка на объект может указать потоку GL освободить память при следующем запуске.   -  person Andy    schedule 03.05.2014


Ответы (1)


Я никогда не делал этого сам — очень немногие люди когда-либо нуждались в этом, — но я думаю, что это один из способов сделать это.

abstract class ConnectionReference extends PhantomReference<Connection> {
  abstract void cleanUp();
}
...
ReferenceQueue<Connection> connectionQueue = new ReferenceQueue<>();
...
Connection newConnection = ...
ConnectionReference ref = new ConnectionReference(newConnection, connectionQueue, ...);
...
// draining the queue in some thread somewhere...
Reference<? extends Connection> reference = connectionQueue.poll();
if (reference != null) {
  ((ConnectionReference) reference).cleanUp();
}
...

Это более или менее похоже на то, что предлагает этот пост.

person Louis Wasserman    schedule 22.03.2012