equal
deleted
inserted
replaced
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(); |