У меня возникает небольшая путаница в отношении PhantomReference в java. Когда я смотрел в онлайн-статьях, большинство из них отметили, что объект PhantomReference будет возвращать null после создания, даже если мы вызываем get() в ссылке, а также упоминаем, что объекты доступны с фантомным доступом, будут вставлены в ReferenceQueue, когда PhantomReference будет удалено из память.Какова связь между PhantomReference и ReferenceQueue?
Я пробовал следующий пример кода, но у меня есть путаница в отношении результата.
Equipment equipment = new Equipment();
ReferenceQueue queue = new ReferenceQueue();
PhantomReference pr = new PhantomReference(equipment, queue);
System.out.println(pr.get());
System.out.println(queue.poll());
Вышеуказанные утверждения печатают null. Если pr.get() возвращает null, значит ли это, что объект, на который ссылается pr, собирает мусор? Если это так, почему объект все еще не добавлен в очередь приоритетов?
Может кто-нибудь помочь, пожалуйста, прояснить это. Я извиняюсь от вас, если мое понимание неверно в отношении PhantomReference и ReferenceQueue.
Пожалуйста, опишите эти два термина просто, а
спасибо большое
Спасибо за ваш ответ, и это помогло мне понять контекст яснее, но я хотел бы знать, почему вы вызываете System.gc(); а затем вызовите queue.remove(). Не могли бы вы объяснить это? – Dilan
@ user3115189 'System.gc()' является _suggestion_ в сборщик мусора, чтобы мусор собирал все, что мог. Это дает нам больше шансов увидеть, что объект «Оборудование» является сборкой мусора. 'Очереди.remove() 'вызывается вместо' poll() ', потому что он блокирует ожидание того, что запись будет доступна в очереди. См. Цитату из javadoc в моем ответе. Фантомная ссылка может быть добавлена в очередь через некоторое время ** **. Мы хотим подождать, пока это не произойдет. –
Большое спасибо вам – Dilan