Created
July 25, 2019 22:06
-
-
Save jmgao/d00e7146f4c166757e72a893c31592e6 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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