import java.lang.ref.ReferenceQueue;
import java.util.HashSet;
import java.util.Set;

public class Test {

    public static void main(String[] args) throws InterruptedException {
        ReferenceQueue<Address> referenceQueue = new ReferenceQueue<>();
        Set<AddressPhantomReference> references = new HashSet<>();

        House house = new House();
        Address address = house.getAddress();

        System.out.println("create House " + house);
        System.out.println("create Address " + address);

        references.add(new AddressPhantomReference(address, referenceQueue));

        house = null;
        address = null; // change house to unreachable and address to phantom reachable.

        System.gc();

        while (true) {
            AddressPhantomReference reference = (AddressPhantomReference) referenceQueue.poll();
            if (reference != null) { // will not be execute!
                reference.finalizeResources();
                reference.clear();
                references.remove(reference);
            }
            if (references.isEmpty()) break;
            Thread.sleep(1000);
        }
    }
}

