import java.util.function.BiFunction;
import java.lang.ref.PhantomReference;
import java.lang.ref.WeakReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.Reference;
class ReferencesTest {
private static SomeObject resurrectedObject = null;
private static int nextAttemptToKillCounter = 0;
private static void referenceTest(
BiFunction<SomeObject, ReferenceQueue<? super SomeObject>,
Reference<? extends SomeObject>> constr, int delay)
ReferenceQueue<SomeObject> rq = new ReferenceQueue<>();
SomeObject strongRef = new SomeObject();
Reference<? extends SomeObject> ref = constr.apply(strongRef, rq);
// delete the strong reference
strongRef = null;
// try to trigger the GC
while (true) {
// try to poll something from the RQ
Reference<? extends SomeObject> pulledRef = rq.poll();
System.
out.
printf("poll(): %s\n", pulledRef
); if (pulledRef != null) {
System.
out.
printf("ref.get(): %s\n",
ref.get());
System.
out.
printf("resurrectedObject = %s\n",
resurrectedObject);
break;
}
if (resurrectedObject != null
&& nextAttemptToKillCounter == 0) {
"*exterminate the resurrected object*");
resurrectedObject = null;
// try to trigger the GC
}
if (nextAttemptToKillCounter > 0) {
"*next attempt to kill in %d steps*\n",
nextAttemptToKillCounter);
nextAttemptToKillCounter--;
}
}
}
System.
out.
println("**phantom reference test**");
System.
out.
println("\n**weak reference test**"); }
private static class SomeObject {
@Override
System.
out.
println("*at the finalize method*"); resurrectedObject = this;
nextAttemptToKillCounter = 10;
System.
out.
println("*resurrection*"); }
}
}
aW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaUZ1bmN0aW9uOwoKaW1wb3J0IGphdmEubGFuZy5yZWYuUGhhbnRvbVJlZmVyZW5jZTsKaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWU7CmltcG9ydCBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZTsKCmNsYXNzIFJlZmVyZW5jZXNUZXN0IHsKICAgIHByaXZhdGUgc3RhdGljIFNvbWVPYmplY3QgcmVzdXJyZWN0ZWRPYmplY3QgPSBudWxsOwogICAgcHJpdmF0ZSBzdGF0aWMgaW50IG5leHRBdHRlbXB0VG9LaWxsQ291bnRlciA9IDA7CiAgICAKICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVmZXJlbmNlVGVzdCgKICAgICAgICAgICAgQmlGdW5jdGlvbjxTb21lT2JqZWN0LCBSZWZlcmVuY2VRdWV1ZTw/IHN1cGVyIFNvbWVPYmplY3Q+LAogICAgICAgICAgICAgICAgUmVmZXJlbmNlPD8gZXh0ZW5kcyBTb21lT2JqZWN0Pj4gY29uc3RyLCBpbnQgZGVsYXkpCiAgICAgICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CiAgICAgICAgUmVmZXJlbmNlUXVldWU8U29tZU9iamVjdD4gcnEgPSBuZXcgUmVmZXJlbmNlUXVldWU8PigpOwogICAgICAgIFNvbWVPYmplY3Qgc3Ryb25nUmVmID0gbmV3IFNvbWVPYmplY3QoKTsKICAgICAgICBSZWZlcmVuY2U8PyBleHRlbmRzIFNvbWVPYmplY3Q+IHJlZiA9IGNvbnN0ci5hcHBseShzdHJvbmdSZWYsIHJxKTsKCiAgICAgICAgLy8gZGVsZXRlIHRoZSBzdHJvbmcgcmVmZXJlbmNlCiAgICAgICAgc3Ryb25nUmVmID0gbnVsbDsKICAgICAgICAvLyB0cnkgdG8gdHJpZ2dlciB0aGUgR0MKICAgICAgICBTeXN0ZW0uZ2MoKTsKICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICAvLyB0cnkgdG8gcG9sbCBzb21ldGhpbmcgZnJvbSB0aGUgUlEKICAgICAgICAgICAgUmVmZXJlbmNlPD8gZXh0ZW5kcyBTb21lT2JqZWN0PiBwdWxsZWRSZWYgPSBycS5wb2xsKCk7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJwb2xsKCk6ICVzXG4iLCBwdWxsZWRSZWYpOwogICAgICAgICAgICBpZiAocHVsbGVkUmVmICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJyZWYuZ2V0KCk6ICVzXG4iLAogICAgICAgICAgICAgICAgICAgIHJlZi5nZXQoKSk7CiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigicmVzdXJyZWN0ZWRPYmplY3QgPSAlc1xuIiwKICAgICAgICAgICAgICAgICAgICByZXN1cnJlY3RlZE9iamVjdCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfSAKCiAgICAgICAgICAgIGlmIChyZXN1cnJlY3RlZE9iamVjdCAhPSBudWxsCiAgICAgICAgICAgICAgICAgICAgJiYgbmV4dEF0dGVtcHRUb0tpbGxDb3VudGVyID09IDApIHsKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKICAgICAgICAgICAgICAgICAgICAiKmV4dGVybWluYXRlIHRoZSByZXN1cnJlY3RlZCBvYmplY3QqIik7CiAgICAgICAgICAgICAgICByZXN1cnJlY3RlZE9iamVjdCA9IG51bGw7CiAgICAgICAgICAgICAgICAvLyB0cnkgdG8gdHJpZ2dlciB0aGUgR0MKICAgICAgICAgICAgICAgIFN5c3RlbS5nYygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZXh0QXR0ZW1wdFRvS2lsbENvdW50ZXIgPiAwKSB7CiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigKICAgICAgICAgICAgICAgICAgICAiKm5leHQgYXR0ZW1wdCB0byBraWxsIGluICVkIHN0ZXBzKlxuIiwKICAgICAgICAgICAgICAgICAgICBuZXh0QXR0ZW1wdFRvS2lsbENvdW50ZXIpOwogICAgICAgICAgICAgICAgbmV4dEF0dGVtcHRUb0tpbGxDb3VudGVyLS07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRocmVhZC5zbGVlcChkZWxheSk7CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKnBoYW50b20gcmVmZXJlbmNlIHRlc3QqKiIpOwogICAgICAgIHJlZmVyZW5jZVRlc3QoUGhhbnRvbVJlZmVyZW5jZTo6bmV3LCAyNTApOwogICAgICAgIAogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG4qKndlYWsgcmVmZXJlbmNlIHRlc3QqKiIpOwogICAgICAgIHJlZmVyZW5jZVRlc3QoV2Vha1JlZmVyZW5jZTo6bmV3LCAyNTApOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNvbWVPYmplY3QgewogICAgICAgIEBPdmVycmlkZQogICAgICAgIHB1YmxpYyB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKmF0IHRoZSBmaW5hbGl6ZSBtZXRob2QqIik7CiAgICAgICAgICAgIHJlc3VycmVjdGVkT2JqZWN0ID0gdGhpczsKICAgICAgICAgICAgbmV4dEF0dGVtcHRUb0tpbGxDb3VudGVyID0gMTA7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKnJlc3VycmVjdGlvbioiKTsKICAgICAgICB9CiAgICB9Cn0=