Betrachten Sie den folgenden Code:
Code: Select all
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));
}
}
Mobile version