Я экспериментирую с поведением жизненного цикла объектов низкого уровня в 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