ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AtomicStampedReferenceTest.java
Revision: 1.25
Committed: Wed Jan 27 01:57:24 2021 UTC (3 years, 3 months ago) by jsr166
Branch: MAIN
CVS Tags: HEAD
Changes since 1.24: +8 -8 lines
Log Message:
use diamond <> pervasively

File Contents

# Content
1 /*
2 * 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 * http://creativecommons.org/publicdomain/zero/1.0/
5 * Other contributors include Andrew Wright, Jeffrey Hayes,
6 * Pat Fisher, Mike Judd.
7 */
8
9 import java.util.concurrent.atomic.AtomicStampedReference;
10
11 import junit.framework.Test;
12 import junit.framework.TestSuite;
13
14 public class AtomicStampedReferenceTest extends JSR166TestCase {
15 public static void main(String[] args) {
16 main(suite(), args);
17 }
18 public static Test suite() {
19 return new TestSuite(AtomicStampedReferenceTest.class);
20 }
21
22 /**
23 * constructor initializes to given reference and stamp
24 */
25 public void testConstructor() {
26 AtomicStampedReference<Item> ai = new AtomicStampedReference<>(one, 0);
27 assertSame(one, ai.getReference());
28 assertEquals(0, ai.getStamp());
29 AtomicStampedReference<Item> a2 = new AtomicStampedReference<>(null, 1);
30 assertNull(a2.getReference());
31 assertEquals(1, a2.getStamp());
32 }
33
34 /**
35 * get returns the last values of reference and stamp set
36 */
37 public void testGetSet() {
38 int[] mark = new int[1];
39 AtomicStampedReference<Item> ai = new AtomicStampedReference<>(one, 0);
40 assertSame(one, ai.getReference());
41 assertEquals(0, ai.getStamp());
42 assertSame(one, ai.get(mark));
43 assertEquals(0, mark[0]);
44 ai.set(two, 0);
45 assertSame(two, ai.getReference());
46 assertEquals(0, ai.getStamp());
47 assertSame(two, ai.get(mark));
48 assertEquals(0, mark[0]);
49 ai.set(one, 1);
50 assertSame(one, ai.getReference());
51 assertEquals(1, ai.getStamp());
52 assertSame(one, ai.get(mark));
53 assertEquals(1, mark[0]);
54 }
55
56 /**
57 * attemptStamp succeeds in single thread
58 */
59 public void testAttemptStamp() {
60 int[] mark = new int[1];
61 AtomicStampedReference<Item> ai = new AtomicStampedReference<>(one, 0);
62 assertEquals(0, ai.getStamp());
63 assertTrue(ai.attemptStamp(one, 1));
64 assertEquals(1, ai.getStamp());
65 assertSame(one, ai.get(mark));
66 assertEquals(1, mark[0]);
67 }
68
69 /**
70 * compareAndSet succeeds in changing values if equal to expected reference
71 * and stamp else fails
72 */
73 public void testCompareAndSet() {
74 int[] mark = new int[1];
75 AtomicStampedReference<Item> ai = new AtomicStampedReference<>(one, 0);
76 assertSame(one, ai.get(mark));
77 assertEquals(0, ai.getStamp());
78 assertEquals(0, mark[0]);
79
80 assertTrue(ai.compareAndSet(one, two, 0, 0));
81 assertSame(two, ai.get(mark));
82 assertEquals(0, mark[0]);
83
84 assertTrue(ai.compareAndSet(two, minusThree, 0, 1));
85 assertSame(minusThree, ai.get(mark));
86 assertEquals(1, mark[0]);
87
88 assertFalse(ai.compareAndSet(two, minusThree, 1, 1));
89 assertSame(minusThree, ai.get(mark));
90 assertEquals(1, mark[0]);
91 }
92
93 /**
94 * compareAndSet in one thread enables another waiting for reference value
95 * to succeed
96 */
97 public void testCompareAndSetInMultipleThreads() throws Exception {
98 final AtomicStampedReference<Item> ai = new AtomicStampedReference<>(one, 0);
99 Thread t = new Thread(new CheckedRunnable() {
100 public void realRun() {
101 while (!ai.compareAndSet(two, three, 0, 0))
102 Thread.yield();
103 }});
104
105 t.start();
106 assertTrue(ai.compareAndSet(one, two, 0, 0));
107 t.join(LONG_DELAY_MS);
108 assertFalse(t.isAlive());
109 assertSame(three, ai.getReference());
110 assertEquals(0, ai.getStamp());
111 }
112
113 /**
114 * compareAndSet in one thread enables another waiting for stamp value
115 * to succeed
116 */
117 public void testCompareAndSetInMultipleThreads2() throws Exception {
118 final AtomicStampedReference<Item> ai = new AtomicStampedReference<>(one, 0);
119 Thread t = new Thread(new CheckedRunnable() {
120 public void realRun() {
121 while (!ai.compareAndSet(one, one, 1, 2))
122 Thread.yield();
123 }});
124
125 t.start();
126 assertTrue(ai.compareAndSet(one, one, 0, 1));
127 t.join(LONG_DELAY_MS);
128 assertFalse(t.isAlive());
129 assertSame(one, ai.getReference());
130 assertEquals(2, ai.getStamp());
131 }
132
133 /**
134 * repeated weakCompareAndSet succeeds in changing values when equal
135 * to expected
136 */
137 public void testWeakCompareAndSet() {
138 int[] mark = new int[1];
139 AtomicStampedReference<Item> ai = new AtomicStampedReference<>(one, 0);
140 assertSame(one, ai.get(mark));
141 assertEquals(0, ai.getStamp());
142 assertEquals(0, mark[0]);
143
144 do {} while (!ai.weakCompareAndSet(one, two, 0, 0));
145 assertSame(two, ai.get(mark));
146 assertEquals(0, mark[0]);
147
148 do {} while (!ai.weakCompareAndSet(two, minusThree, 0, 1));
149 assertSame(minusThree, ai.get(mark));
150 assertEquals(1, mark[0]);
151 }
152
153 }