Skip to content

Instantly share code, notes, and snippets.

@zencd
Created August 10, 2019 02:49
Show Gist options
  • Save zencd/e78bd7453a7c73eb8f31b284dc43b0b9 to your computer and use it in GitHub Desktop.
Save zencd/e78bd7453a7c73eb8f31b284dc43b0b9 to your computer and use it in GitHub Desktop.
Using WeakReference instead of PhantomReference
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.util.Random;
public class WeakReferenceAsPhantom {
static class CustomObject {
final int externalResourceId = new Random().nextInt(); // any resource descriptor, etc
}
static class CustomFinalizer extends WeakReference<CustomObject> {
private final int externalResourceId;
public CustomFinalizer(CustomObject referent, ReferenceQueue<CustomObject> q) {
super(referent, q);
// XXX do not store `referent` reference to this!
this.externalResourceId = referent.externalResourceId;
}
public void finalizeResources() {
// finish it!
System.out.println("freeing resource " + externalResourceId);
}
}
public static void main(String[] args) throws Exception {
var referenceQueue = new ReferenceQueue<CustomObject>();
var referent = new CustomObject();
var weak = new CustomFinalizer(referent, referenceQueue);
referent = null; // making it GC-ready
System.gc();
// you probably need a separate thread for real application
var aRef = referenceQueue.remove(); // XXX it's blocking
((CustomFinalizer) aRef).finalizeResources();
aRef.clear();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment