Почему PhantomReference ставится в очередь перед запуском Cleaner, когда объект воскрешается во время финализации?JAVA

Программисты JAVA общаются здесь
Anonymous
Почему PhantomReference ставится в очередь перед запуском Cleaner, когда объект воскрешается во время финализации?

Сообщение Anonymous »

Я экспериментирую с поведением жизненного цикла объектов низкого уровня в JVM (Java 17, HotSpot), включая PhantomReference, ReferenceQueue, Cleaner и воскрешение объекта во время финализации.
Рассмотрим следующий код:
import java.lang.ref.*;

import java.util.concurrent.atomic.AtomicReference;

public class PhantomTest {

static AtomicReference resurrected = new AtomicReference();

static class Resource {

@Override

protected void finalize() throws Throwable {

// resurrect object

resurrected.set(this);

}

}

public static void main(String[] args) throws Exception {

ReferenceQueue queue = new ReferenceQueue();

Object obj = new Resource();

PhantomReference phantom =

new PhantomReference(obj, queue);

Cleaner cleaner = Cleaner.create();

cleaner.register(obj, () ->

System.out.println("Cleaner executed"));

obj = null;

System.gc();

Thread.sleep(200);

Reference ref = queue.poll();

System.out.println("Phantom enqueued: " + (ref != null));

System.out.println("Resurrected: " + (resurrected.get() != null));

}

}


Подробнее здесь: https://stackoverflow.com/questions/798 ... -object-is

Вернуться в «JAVA»