ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AtomicReferenceArrayTest.java
Revision: 1.33
Committed: Thu Jun 16 23:35:25 2016 UTC (7 years, 10 months ago) by dl
Branch: MAIN
Changes since 1.32: +243 -0 lines
Log Message:
Add VarHandle atomic methods to Atomic classes

File Contents

# User Rev Content
1 dl 1.1 /*
2 dl 1.6 * Written by Doug Lea with assistance from members of JCP JSR-166
3     * Expert Group and released to the public domain, as explained at
4 jsr166 1.19 * http://creativecommons.org/publicdomain/zero/1.0/
5 jsr166 1.11 * Other contributors include Andrew Wright, Jeffrey Hayes,
6     * Pat Fisher, Mike Judd.
7 dl 1.1 */
8    
9 jsr166 1.21 import java.util.Arrays;
10     import java.util.concurrent.atomic.AtomicReferenceArray;
11 dl 1.1
12 jsr166 1.29 import junit.framework.Test;
13     import junit.framework.TestSuite;
14    
15 jsr166 1.13 public class AtomicReferenceArrayTest extends JSR166TestCase {
16 jsr166 1.18 public static void main(String[] args) {
17 jsr166 1.32 main(suite(), args);
18 dl 1.1 }
19     public static Test suite() {
20     return new TestSuite(AtomicReferenceArrayTest.class);
21     }
22    
23 dl 1.4 /**
24 dl 1.5 * constructor creates array of given size with all elements null
25 dl 1.4 */
26 jsr166 1.13 public void testConstructor() {
27 jsr166 1.26 AtomicReferenceArray<Integer> aa = new AtomicReferenceArray<Integer>(SIZE);
28     for (int i = 0; i < SIZE; i++) {
29     assertNull(aa.get(i));
30 dl 1.1 }
31     }
32    
33 dl 1.4 /**
34 dl 1.7 * constructor with null array throws NPE
35     */
36     public void testConstructor2NPE() {
37     try {
38     Integer[] a = null;
39 jsr166 1.31 new AtomicReferenceArray<Integer>(a);
40 jsr166 1.14 shouldThrow();
41 jsr166 1.15 } catch (NullPointerException success) {}
42 dl 1.7 }
43    
44     /**
45     * constructor with array is of same size and has all elements
46     */
47     public void testConstructor2() {
48 jsr166 1.23 Integer[] a = { two, one, three, four, seven };
49 jsr166 1.26 AtomicReferenceArray<Integer> aa = new AtomicReferenceArray<Integer>(a);
50     assertEquals(a.length, aa.length());
51     for (int i = 0; i < a.length; i++)
52     assertEquals(a[i], aa.get(i));
53 dl 1.7 }
54    
55     /**
56 jsr166 1.27 * Initialize AtomicReferenceArray<Class> with SubClass[]
57 jsr166 1.22 */
58     public void testConstructorSubClassArray() {
59     Integer[] a = { two, one, three, four, seven };
60     AtomicReferenceArray<Number> aa = new AtomicReferenceArray<Number>(a);
61     assertEquals(a.length, aa.length());
62 jsr166 1.26 for (int i = 0; i < a.length; i++) {
63 jsr166 1.22 assertSame(a[i], aa.get(i));
64     Long x = Long.valueOf(i);
65     aa.set(i, x);
66     assertSame(x, aa.get(i));
67     }
68     }
69    
70     /**
71 dl 1.5 * get and set for out of bound indices throw IndexOutOfBoundsException
72     */
73 jsr166 1.13 public void testIndexing() {
74 jsr166 1.26 AtomicReferenceArray<Integer> aa = new AtomicReferenceArray<Integer>(SIZE);
75     for (int index : new int[] { -1, SIZE }) {
76     try {
77     aa.get(index);
78     shouldThrow();
79     } catch (IndexOutOfBoundsException success) {}
80     try {
81     aa.set(index, null);
82     shouldThrow();
83     } catch (IndexOutOfBoundsException success) {}
84     try {
85     aa.lazySet(index, null);
86     shouldThrow();
87     } catch (IndexOutOfBoundsException success) {}
88     try {
89     aa.compareAndSet(index, null, null);
90     shouldThrow();
91     } catch (IndexOutOfBoundsException success) {}
92     try {
93     aa.weakCompareAndSet(index, null, null);
94     shouldThrow();
95     } catch (IndexOutOfBoundsException success) {}
96 dl 1.33 try {
97     aa.getPlain(index);
98     shouldThrow();
99     } catch (IndexOutOfBoundsException success) {}
100     try {
101     aa.getOpaque(index);
102     shouldThrow();
103     } catch (IndexOutOfBoundsException success) {}
104     try {
105     aa.getAcquire(index);
106     shouldThrow();
107     } catch (IndexOutOfBoundsException success) {}
108     try {
109     aa.setPlain(index, null);
110     shouldThrow();
111     } catch (IndexOutOfBoundsException success) {}
112     try {
113     aa.setOpaque(index, null);
114     shouldThrow();
115     } catch (IndexOutOfBoundsException success) {}
116     try {
117     aa.setRelease(index, null);
118     shouldThrow();
119     } catch (IndexOutOfBoundsException success) {}
120     try {
121     aa.compareAndExchange(index, null, null);
122     shouldThrow();
123     } catch (IndexOutOfBoundsException success) {}
124     try {
125     aa.compareAndExchangeAcquire(index, null, null);
126     shouldThrow();
127     } catch (IndexOutOfBoundsException success) {}
128     try {
129     aa.compareAndExchangeRelease(index, null, null);
130     shouldThrow();
131     } catch (IndexOutOfBoundsException success) {}
132     try {
133     aa.weakCompareAndSetVolatile(index, null, null);
134     shouldThrow();
135     } catch (IndexOutOfBoundsException success) {}
136     try {
137     aa.weakCompareAndSetAcquire(index, null, null);
138     shouldThrow();
139     } catch (IndexOutOfBoundsException success) {}
140     try {
141     aa.weakCompareAndSetRelease(index, null, null);
142     shouldThrow();
143     } catch (IndexOutOfBoundsException success) {}
144 dl 1.5 }
145     }
146    
147     /**
148     * get returns the last value set at index
149 dl 1.4 */
150 jsr166 1.13 public void testGetSet() {
151 jsr166 1.26 AtomicReferenceArray aa = new AtomicReferenceArray(SIZE);
152     for (int i = 0; i < SIZE; i++) {
153     aa.set(i, one);
154     assertSame(one, aa.get(i));
155     aa.set(i, two);
156     assertSame(two, aa.get(i));
157     aa.set(i, m3);
158     assertSame(m3, aa.get(i));
159 dl 1.1 }
160     }
161    
162 dl 1.4 /**
163 dl 1.10 * get returns the last value lazySet at index by same thread
164     */
165 jsr166 1.13 public void testGetLazySet() {
166 jsr166 1.26 AtomicReferenceArray aa = new AtomicReferenceArray(SIZE);
167     for (int i = 0; i < SIZE; i++) {
168     aa.lazySet(i, one);
169     assertSame(one, aa.get(i));
170     aa.lazySet(i, two);
171     assertSame(two, aa.get(i));
172     aa.lazySet(i, m3);
173     assertSame(m3, aa.get(i));
174 dl 1.10 }
175     }
176    
177     /**
178 dl 1.5 * compareAndSet succeeds in changing value if equal to expected else fails
179 dl 1.4 */
180 jsr166 1.13 public void testCompareAndSet() {
181 jsr166 1.26 AtomicReferenceArray aa = new AtomicReferenceArray(SIZE);
182     for (int i = 0; i < SIZE; i++) {
183     aa.set(i, one);
184     assertTrue(aa.compareAndSet(i, one, two));
185     assertTrue(aa.compareAndSet(i, two, m4));
186     assertSame(m4, aa.get(i));
187     assertFalse(aa.compareAndSet(i, m5, seven));
188     assertSame(m4, aa.get(i));
189     assertTrue(aa.compareAndSet(i, m4, seven));
190     assertSame(seven, aa.get(i));
191 dl 1.1 }
192     }
193    
194 dl 1.4 /**
195 dl 1.5 * compareAndSet in one thread enables another waiting for value
196     * to succeed
197     */
198 jsr166 1.15 public void testCompareAndSetInMultipleThreads() throws InterruptedException {
199 dl 1.5 final AtomicReferenceArray a = new AtomicReferenceArray(1);
200     a.set(0, one);
201 jsr166 1.16 Thread t = new Thread(new CheckedRunnable() {
202     public void realRun() {
203     while (!a.compareAndSet(0, two, three))
204     Thread.yield();
205     }});
206 jsr166 1.15
207     t.start();
208     assertTrue(a.compareAndSet(0, one, two));
209     t.join(LONG_DELAY_MS);
210     assertFalse(t.isAlive());
211 jsr166 1.25 assertSame(three, a.get(0));
212 dl 1.5 }
213    
214     /**
215     * repeated weakCompareAndSet succeeds in changing value when equal
216 jsr166 1.11 * to expected
217 dl 1.4 */
218 jsr166 1.13 public void testWeakCompareAndSet() {
219 jsr166 1.26 AtomicReferenceArray aa = new AtomicReferenceArray(SIZE);
220     for (int i = 0; i < SIZE; i++) {
221     aa.set(i, one);
222 jsr166 1.30 do {} while (!aa.weakCompareAndSet(i, one, two));
223     do {} while (!aa.weakCompareAndSet(i, two, m4));
224 jsr166 1.26 assertSame(m4, aa.get(i));
225 jsr166 1.30 do {} while (!aa.weakCompareAndSet(i, m4, seven));
226 jsr166 1.26 assertSame(seven, aa.get(i));
227 dl 1.1 }
228     }
229    
230 dl 1.4 /**
231 dl 1.5 * getAndSet returns previous value and sets to given value at given index
232 dl 1.4 */
233 jsr166 1.13 public void testGetAndSet() {
234 jsr166 1.26 AtomicReferenceArray aa = new AtomicReferenceArray(SIZE);
235     for (int i = 0; i < SIZE; i++) {
236     aa.set(i, one);
237     assertSame(one, aa.getAndSet(i, zero));
238     assertSame(zero, aa.getAndSet(i, m10));
239     assertSame(m10, aa.getAndSet(i, one));
240 dl 1.1 }
241     }
242    
243 dl 1.4 /**
244 dl 1.5 * a deserialized serialized array holds same values
245 dl 1.4 */
246 jsr166 1.15 public void testSerialization() throws Exception {
247 jsr166 1.21 AtomicReferenceArray x = new AtomicReferenceArray(SIZE);
248     for (int i = 0; i < SIZE; i++) {
249     x.set(i, new Integer(-i));
250     }
251     AtomicReferenceArray y = serialClone(x);
252 jsr166 1.28 assertNotSame(x, y);
253 jsr166 1.21 assertEquals(x.length(), y.length());
254     for (int i = 0; i < SIZE; i++) {
255     assertEquals(x.get(i), y.get(i));
256 dl 1.2 }
257     }
258 dl 1.1
259 dl 1.9 /**
260     * toString returns current value.
261 jsr166 1.11 */
262 dl 1.9 public void testToString() {
263 jsr166 1.23 Integer[] a = { two, one, three, four, seven };
264 jsr166 1.26 AtomicReferenceArray<Integer> aa = new AtomicReferenceArray<Integer>(a);
265     assertEquals(Arrays.toString(a), aa.toString());
266 dl 1.9 }
267 dl 1.33
268     // jdk9
269    
270     /**
271     * getPlain returns the last value set
272     */
273     public void testGetPlainSet() {
274     AtomicReferenceArray<Integer> aa = new AtomicReferenceArray<Integer>(SIZE);
275     for (int i = 0; i < SIZE; i++) {
276     aa.set(i, one);
277     assertEquals(one, aa.getPlain(i));
278     aa.set(i, two);
279     assertEquals(two, aa.getPlain(i));
280     aa.set(i, m3);
281     assertEquals(m3, aa.getPlain(i));
282     }
283     }
284    
285     /**
286     * getOpaque returns the last value set
287     */
288     public void testGetOpaqueSet() {
289     AtomicReferenceArray<Integer> aa = new AtomicReferenceArray<Integer>(SIZE);
290     for (int i = 0; i < SIZE; i++) {
291     aa.set(i, one);
292     assertEquals(one, aa.getOpaque(i));
293     aa.set(i, two);
294     assertEquals(two, aa.getOpaque(i));
295     aa.set(i, m3);
296     assertEquals(m3, aa.getOpaque(i));
297     }
298     }
299    
300     /**
301     * getAcquire returns the last value set
302     */
303     public void testGetAcquireSet() {
304     AtomicReferenceArray<Integer> aa = new AtomicReferenceArray<Integer>(SIZE);
305     for (int i = 0; i < SIZE; i++) {
306     aa.set(i, one);
307     assertEquals(one, aa.getAcquire(i));
308     aa.set(i, two);
309     assertEquals(two, aa.getAcquire(i));
310     aa.set(i, m3);
311     assertEquals(m3, aa.getAcquire(i));
312     }
313     }
314    
315     /**
316     * get returns the last value setPlain
317     */
318     public void testGetSetPlain() {
319     AtomicReferenceArray<Integer> aa = new AtomicReferenceArray<Integer>(SIZE);
320     for (int i = 0; i < SIZE; i++) {
321     aa.setPlain(i, one);
322     assertEquals(one, aa.get(i));
323     aa.setPlain(i, two);
324     assertEquals(two, aa.get(i));
325     aa.setPlain(i, m3);
326     assertEquals(m3, aa.get(i));
327     }
328     }
329    
330     /**
331     * get returns the last value setOpaque
332     */
333     public void testGetSetOpaque() {
334     AtomicReferenceArray<Integer> aa = new AtomicReferenceArray<Integer>(SIZE);
335     for (int i = 0; i < SIZE; i++) {
336     aa.setOpaque(i, one);
337     assertEquals(one, aa.get(i));
338     aa.setOpaque(i, two);
339     assertEquals(two, aa.get(i));
340     aa.setOpaque(i, m3);
341     assertEquals(m3, aa.get(i));
342     }
343     }
344    
345     /**
346     * get returns the last value setRelease
347     */
348     public void testGetSetRelease() {
349     AtomicReferenceArray<Integer> aa = new AtomicReferenceArray<Integer>(SIZE);
350     for (int i = 0; i < SIZE; i++) {
351     aa.setRelease(i, one);
352     assertEquals(one, aa.get(i));
353     aa.setRelease(i, two);
354     assertEquals(two, aa.get(i));
355     aa.setRelease(i, m3);
356     assertEquals(m3, aa.get(i));
357     }
358     }
359    
360     /**
361     * compareAndExchange succeeds in changing value if equal to
362     * expected else fails
363     */
364     public void testCompareAndExchange() {
365     AtomicReferenceArray<Integer> aa = new AtomicReferenceArray<Integer>(SIZE);
366     for (int i = 0; i < SIZE; i++) {
367     aa.set(i, one);
368     assertEquals(one, aa.compareAndExchange(i, one, two));
369     assertEquals(two, aa.compareAndExchange(i, two, m4));
370     assertEquals(m4, aa.get(i));
371     assertEquals(m4, aa.compareAndExchange(i,m5, seven));
372     assertEquals(m4, aa.get(i));
373     assertEquals(m4, aa.compareAndExchange(i, m4, seven));
374     assertEquals(seven, aa.get(i));
375     }
376     }
377    
378     /**
379     * compareAndExchangeAcquire succeeds in changing value if equal to
380     * expected else fails
381     */
382     public void testCompareAndExchangeAcquire() {
383     AtomicReferenceArray<Integer> aa = new AtomicReferenceArray<Integer>(SIZE);
384     for (int i = 0; i < SIZE; i++) {
385     aa.set(i, one);
386     assertEquals(one, aa.compareAndExchangeAcquire(i, one, two));
387     assertEquals(two, aa.compareAndExchangeAcquire(i, two, m4));
388     assertEquals(m4, aa.get(i));
389     assertEquals(m4, aa.compareAndExchangeAcquire(i,m5, seven));
390     assertEquals(m4, aa.get(i));
391     assertEquals(m4, aa.compareAndExchangeAcquire(i, m4, seven));
392     assertEquals(seven, aa.get(i));
393     }
394     }
395    
396     /**
397     * compareAndExchangeRelease succeeds in changing value if equal to
398     * expected else fails
399     */
400     public void testCompareAndExchangeRelease() {
401     AtomicReferenceArray<Integer> aa = new AtomicReferenceArray<Integer>(SIZE);
402     for (int i = 0; i < SIZE; i++) {
403     aa.set(i, one);
404     assertEquals(one, aa.compareAndExchangeRelease(i, one, two));
405     assertEquals(two, aa.compareAndExchangeRelease(i, two, m4));
406     assertEquals(m4, aa.get(i));
407     assertEquals(m4, aa.compareAndExchangeRelease(i,m5, seven));
408     assertEquals(m4, aa.get(i));
409     assertEquals(m4, aa.compareAndExchangeRelease(i, m4, seven));
410     assertEquals(seven, aa.get(i));
411     }
412     }
413    
414     /**
415     * repeated weakCompareAndSetVolatile succeeds in changing value when equal
416     * to expected
417     */
418     public void testWeakCompareAndSetVolatile() {
419     AtomicReferenceArray<Integer> aa = new AtomicReferenceArray<Integer>(SIZE);
420     for (int i = 0; i < SIZE; i++) {
421     aa.set(i, one);
422     do {} while (!aa.weakCompareAndSetVolatile(i, one, two));
423     do {} while (!aa.weakCompareAndSetVolatile(i, two, m4));
424     assertEquals(m4, aa.get(i));
425     do {} while (!aa.weakCompareAndSetVolatile(i, m4, seven));
426     assertEquals(seven, aa.get(i));
427     }
428     }
429    
430     /**
431     * repeated weakCompareAndSetAcquire succeeds in changing value when equal
432     * to expected
433     */
434     public void testWeakCompareAndSetAcquire() {
435     AtomicReferenceArray<Integer> aa = new AtomicReferenceArray<Integer>(SIZE);
436     for (int i = 0; i < SIZE; i++) {
437     aa.set(i, one);
438     do {} while (!aa.weakCompareAndSetAcquire(i, one, two));
439     do {} while (!aa.weakCompareAndSetAcquire(i, two, m4));
440     assertEquals(m4, aa.get(i));
441     do {} while (!aa.weakCompareAndSetAcquire(i, m4, seven));
442     assertEquals(seven, aa.get(i));
443     }
444     }
445    
446     /**
447     * repeated weakCompareAndSetRelease succeeds in changing value when equal
448     * to expected
449     */
450     public void testWeakCompareAndSetRelease() {
451     AtomicReferenceArray<Integer> aa = new AtomicReferenceArray<Integer>(SIZE);
452     for (int i = 0; i < SIZE; i++) {
453     aa.set(i, one);
454     do {} while (!aa.weakCompareAndSetRelease(i, one, two));
455     do {} while (!aa.weakCompareAndSetRelease(i, two, m4));
456     assertEquals(m4, aa.get(i));
457     do {} while (!aa.weakCompareAndSetRelease(i, m4, seven));
458     assertEquals(seven, aa.get(i));
459     }
460     }
461    
462 dl 1.1 }