Skip to content

Instantly share code, notes, and snippets.

@jmgao
Created July 25, 2019 22:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jmgao/d00e7146f4c166757e72a893c31592e6 to your computer and use it in GitHub Desktop.
Save jmgao/d00e7146f4c166757e72a893c31592e6 to your computer and use it in GitHub Desktop.
import sun.misc.Cleaner;
import java.util.concurrent.atomic.AtomicBoolean;
class Resource {
private AtomicBoolean cleaned;
public Resource(AtomicBoolean b) {
this.cleaned = b;
}
public void clean() {
this.cleaned.set(true);
}
}
class Closer implements Runnable {
private Resource resource;
public Closer(Resource resource) {
this.resource = resource;
}
@Override
public void run() {
this.resource.clean();
}
}
class Wrapper {
Resource wrapped;
}
class CleanerTest {
public static void unwrapped(AtomicBoolean cleaned) {
Resource resource = new Resource(cleaned);
Closer closer = new Closer(resource);
Cleaner.create(resource, closer);
}
public static void wrapped(AtomicBoolean cleaned) {
Resource resource = new Resource(cleaned);
Closer closer = new Closer(resource);
Wrapper wrapper = new Wrapper();
wrapper.wrapped = resource;
Cleaner.create(wrapper, closer);
}
public static void main(String[] args) {
{
AtomicBoolean cleaned = new AtomicBoolean(false);
wrapped(cleaned);
while (!cleaned.get()) {
System.gc();
}
System.out.println("Cleaner ran wrapped");
}
{
AtomicBoolean cleaned = new AtomicBoolean(false);
unwrapped(cleaned);
while (!cleaned.get()) {
System.gc();
}
System.out.println("Cleaner ran unwrapped");
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment