package java.lang.ref; import gnu.testlet.Testlet; import gnu.testlet.TestHarness; public class TestWeakReference implements Testlet { public int getExpectedPass() { return 10; } public int getExpectedFail() { return 0; } public int getExpectedKnownFail() { return 0; } int objAddr; WeakReference gcWeakRef; WeakReference gcWeakRef2; class SetWeakRefThread extends Thread { public void run() { Object obj = new Object(); gcWeakRef = new WeakReference(obj); gcWeakRef2 = new WeakReference(obj); } } public void test(TestHarness th) { Object obj = new Object(); WeakReference weakRef = new WeakReference(obj); WeakReference weakRef2 = new WeakReference(obj); th.check(weakRef.get(), obj, "weakly held referent is object"); th.check(weakRef2.get(), obj, "second weakly held referent is object"); weakRef.clear(); th.check(weakRef.get() == null, "cleared weakly held referent is null"); weakRef.clear(); th.check(weakRef.get() == null, "clearing a cleared WeakReference works"); th.check(weakRef2.get(), obj, "second weakly held referent is object"); SetWeakRefThread thread = new SetWeakRefThread(); thread.start(); try { thread.join(); } catch (InterruptedException e) { th.fail("Unexpected exception: " + e); } th.check(gcWeakRef.get() != null, "weakly held referent isn't null"); th.check(gcWeakRef2.get() != null, "second weakly held referent isn't null"); Runtime.getRuntime().gc(); Runtime.getRuntime().gc(); th.check(gcWeakRef.get() == null, "GC cleared weakly held referent is null"); th.check(gcWeakRef2.get() == null, "second GC cleared weakly held referent is null"); gcWeakRef.clear(); th.check(gcWeakRef.get() == null, "clearing a WeakReference cleared by the GC works"); } }