test/jdk/java/lang/ref/ReferenceEnqueue.java
changeset 48360 2731c0ee46a9
parent 47216 71c04702a3d5
equal deleted inserted replaced
48359:91bd550551e0 48360:2731c0ee46a9
    23 
    23 
    24 /* @test
    24 /* @test
    25  * @bug 4268317 8132306 8175797
    25  * @bug 4268317 8132306 8175797
    26  * @summary Test if Reference.enqueue() works properly with GC
    26  * @summary Test if Reference.enqueue() works properly with GC
    27  * @run main ReferenceEnqueue
    27  * @run main ReferenceEnqueue
    28  * @run main/othervm -Djdk.lang.ref.disableClearBeforeEnqueue=true ReferenceEnqueue
       
    29  */
    28  */
    30 
    29 
    31 import java.lang.ref.*;
    30 import java.lang.ref.*;
    32 import java.util.ArrayList;
    31 import java.util.ArrayList;
    33 import java.util.List;
    32 import java.util.List;
    85 
    84 
    86     static class ExplicitEnqueue {
    85     static class ExplicitEnqueue {
    87         final ReferenceQueue<Object> queue = new ReferenceQueue<>();
    86         final ReferenceQueue<Object> queue = new ReferenceQueue<>();
    88         final List<Reference<Object>> refs = new ArrayList<>();
    87         final List<Reference<Object>> refs = new ArrayList<>();
    89         final int iterations = 1000;
    88         final int iterations = 1000;
    90         final boolean disableClearBeforeEnqueue =
       
    91             Boolean.getBoolean("jdk.lang.ref.disableClearBeforeEnqueue");
       
    92 
    89 
    93         ExplicitEnqueue() {
    90         ExplicitEnqueue() {
    94             this.refs.add(new SoftReference<>(new Object(), queue));
    91             this.refs.add(new SoftReference<>(new Object(), queue));
    95             this.refs.add(new WeakReference<>(new Object(), queue));
    92             this.refs.add(new WeakReference<>(new Object(), queue));
    96             // Can't test PhantomReference because get() always returns null.
    93             // Can't test PhantomReference because get() always returns null.
    99         void run() throws InterruptedException {
    96         void run() throws InterruptedException {
   100             for (Reference<Object> ref : refs) {
    97             for (Reference<Object> ref : refs) {
   101                 if (ref.enqueue() == false) {
    98                 if (ref.enqueue() == false) {
   102                     throw new RuntimeException("Error: enqueue failed");
    99                     throw new RuntimeException("Error: enqueue failed");
   103                 }
   100                 }
   104                 if (disableClearBeforeEnqueue && ref.get() == null) {
   101                 if (ref.get() != null) {
   105                     throw new RuntimeException("Error: clearing should be disabled");
       
   106                 }
       
   107                 if (!disableClearBeforeEnqueue && ref.get() != null) {
       
   108                     throw new RuntimeException("Error: referent must be cleared");
   102                     throw new RuntimeException("Error: referent must be cleared");
   109                 }
   103                 }
   110             }
   104             }
   111 
   105 
   112             System.gc();
   106             System.gc();