[cvs] / jsr166 / src / test / tck / AtomicIntegerFieldUpdaterTest.java Repository:
ViewVC logotype

Annotation of /jsr166/src/test/tck/AtomicIntegerFieldUpdaterTest.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.20 - (view) (download)

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.10 * Other contributors include Andrew Wright, Jeffrey Hayes,
6 :     * Pat Fisher, Mike Judd.
7 : dl 1.1 */
8 :    
9 :     import java.util.concurrent.atomic.*;
10 :     import junit.framework.*;
11 :     import java.util.*;
12 :    
13 : dl 1.2 public class AtomicIntegerFieldUpdaterTest extends JSR166TestCase {
14 : dl 1.1 volatile int x = 0;
15 : dl 1.4 int w;
16 : dl 1.2 long z;
17 : jsr166 1.12 public static void main(String[] args) {
18 : dl 1.1 junit.textui.TestRunner.run(suite());
19 :     }
20 :     public static Test suite() {
21 :     return new TestSuite(AtomicIntegerFieldUpdaterTest.class);
22 :     }
23 :    
24 : dl 1.3 /**
25 : dl 1.7 * Construction with non-existent field throws RuntimeException
26 : dl 1.3 */
27 :     public void testConstructor() {
28 : jsr166 1.11 try {
29 : jsr166 1.10 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest>
30 : dl 1.1 a = AtomicIntegerFieldUpdater.newUpdater
31 : dl 1.5 (AtomicIntegerFieldUpdaterTest.class, "y");
32 : dl 1.3 shouldThrow();
33 : jsr166 1.16 } catch (RuntimeException success) {}
34 : dl 1.2 }
35 :    
36 : dl 1.3 /**
37 : dl 1.4 * construction with field not of given type throws RuntimeException
38 : dl 1.3 */
39 :     public void testConstructor2() {
40 : jsr166 1.11 try {
41 : jsr166 1.10 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest>
42 : dl 1.2 a = AtomicIntegerFieldUpdater.newUpdater
43 : dl 1.5 (AtomicIntegerFieldUpdaterTest.class, "z");
44 : dl 1.3 shouldThrow();
45 : jsr166 1.16 } catch (RuntimeException success) {}
46 : dl 1.1 }
47 :    
48 : dl 1.3 /**
49 : dl 1.4 * construction with non-volatile field throws RuntimeException
50 :     */
51 :     public void testConstructor3() {
52 : jsr166 1.11 try {
53 : jsr166 1.10 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest>
54 : dl 1.4 a = AtomicIntegerFieldUpdater.newUpdater
55 : dl 1.5 (AtomicIntegerFieldUpdaterTest.class, "w");
56 : dl 1.4 shouldThrow();
57 : jsr166 1.16 } catch (RuntimeException success) {}
58 : dl 1.4 }
59 :    
60 :     /**
61 : jsr166 1.18 * get returns the last value set or assigned
62 : dl 1.3 */
63 :     public void testGetSet() {
64 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
65 :     try {
66 :     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
67 :     } catch (RuntimeException ok) {
68 :     return;
69 :     }
70 : dl 1.1 x = 1;
71 : jsr166 1.15 assertEquals(1,a.get(this));
72 :     a.set(this,2);
73 :     assertEquals(2,a.get(this));
74 :     a.set(this,-3);
75 :     assertEquals(-3,a.get(this));
76 : dl 1.1 }
77 : dl 1.9
78 :     /**
79 : jsr166 1.18 * get returns the last value lazySet by same thread
80 : dl 1.9 */
81 :     public void testGetLazySet() {
82 :     AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
83 :     try {
84 :     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
85 :     } catch (RuntimeException ok) {
86 :     return;
87 :     }
88 :     x = 1;
89 : jsr166 1.15 assertEquals(1,a.get(this));
90 :     a.lazySet(this,2);
91 :     assertEquals(2,a.get(this));
92 :     a.lazySet(this,-3);
93 :     assertEquals(-3,a.get(this));
94 : dl 1.9 }
95 :    
96 : dl 1.3 /**
97 : dl 1.4 * compareAndSet succeeds in changing value if equal to expected else fails
98 : dl 1.3 */
99 :     public void testCompareAndSet() {
100 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
101 :     try {
102 :     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
103 :     } catch (RuntimeException ok) {
104 :     return;
105 :     }
106 : dl 1.1 x = 1;
107 : jsr166 1.15 assertTrue(a.compareAndSet(this,1,2));
108 :     assertTrue(a.compareAndSet(this,2,-4));
109 :     assertEquals(-4,a.get(this));
110 :     assertFalse(a.compareAndSet(this,-5,7));
111 : jsr166 1.17 assertEquals(-4,a.get(this));
112 : jsr166 1.15 assertTrue(a.compareAndSet(this,-4,7));
113 :     assertEquals(7,a.get(this));
114 : dl 1.1 }
115 :    
116 : dl 1.4 /**
117 :     * compareAndSet in one thread enables another waiting for value
118 :     * to succeed
119 :     */
120 : jsr166 1.13 public void testCompareAndSetInMultipleThreads() throws Exception {
121 : dl 1.4 x = 1;
122 : dl 1.8 final AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest>a;
123 :     try {
124 :     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
125 :     } catch (RuntimeException ok) {
126 :     return;
127 :     }
128 : dl 1.4
129 : jsr166 1.14 Thread t = new Thread(new CheckedRunnable() {
130 :     public void realRun() {
131 :     while (!a.compareAndSet(AtomicIntegerFieldUpdaterTest.this, 2, 3))
132 :     Thread.yield();
133 :     }});
134 : jsr166 1.13
135 :     t.start();
136 :     assertTrue(a.compareAndSet(this, 1, 2));
137 :     t.join(LONG_DELAY_MS);
138 :     assertFalse(t.isAlive());
139 :     assertEquals(a.get(this), 3);
140 : dl 1.4 }
141 :    
142 : dl 1.3 /**
143 : dl 1.4 * repeated weakCompareAndSet succeeds in changing value when equal
144 : jsr166 1.10 * to expected
145 : dl 1.3 */
146 :     public void testWeakCompareAndSet() {
147 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
148 :     try {
149 :     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
150 :     } catch (RuntimeException ok) {
151 :     return;
152 :     }
153 : dl 1.1 x = 1;
154 : jsr166 1.15 while (!a.weakCompareAndSet(this,1,2));
155 :     while (!a.weakCompareAndSet(this,2,-4));
156 :     assertEquals(-4,a.get(this));
157 :     while (!a.weakCompareAndSet(this,-4,7));
158 :     assertEquals(7,a.get(this));
159 : dl 1.1 }
160 :    
161 : dl 1.3 /**
162 : jsr166 1.18 * getAndSet returns previous value and sets to given value
163 : dl 1.3 */
164 :     public void testGetAndSet() {
165 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
166 :     try {
167 :     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
168 :     } catch (RuntimeException ok) {
169 :     return;
170 :     }
171 : dl 1.1 x = 1;
172 : jsr166 1.15 assertEquals(1,a.getAndSet(this, 0));
173 :     assertEquals(0,a.getAndSet(this,-10));
174 :     assertEquals(-10,a.getAndSet(this,1));
175 : dl 1.1 }
176 :    
177 : dl 1.3 /**
178 : dl 1.4 * getAndAdd returns previous value and adds given value
179 : dl 1.3 */
180 :     public void testGetAndAdd() {
181 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
182 :     try {
183 :     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
184 :     } catch (RuntimeException ok) {
185 :     return;
186 :     }
187 : dl 1.1 x = 1;
188 : jsr166 1.15 assertEquals(1,a.getAndAdd(this,2));
189 :     assertEquals(3,a.get(this));
190 :     assertEquals(3,a.getAndAdd(this,-4));
191 :     assertEquals(-1,a.get(this));
192 : dl 1.1 }
193 :    
194 : dl 1.3 /**
195 : dl 1.4 * getAndDecrement returns previous value and decrements
196 : dl 1.3 */
197 :     public void testGetAndDecrement() {
198 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
199 :     try {
200 :     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
201 :     } catch (RuntimeException ok) {
202 :     return;
203 :     }
204 : dl 1.1 x = 1;
205 : jsr166 1.15 assertEquals(1,a.getAndDecrement(this));
206 :     assertEquals(0,a.getAndDecrement(this));
207 :     assertEquals(-1,a.getAndDecrement(this));
208 : dl 1.1 }
209 :    
210 : dl 1.3 /**
211 : dl 1.4 * getAndIncrement returns previous value and increments
212 : dl 1.3 */
213 :     public void testGetAndIncrement() {
214 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
215 :     try {
216 :     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
217 :     } catch (RuntimeException ok) {
218 :     return;
219 :     }
220 : dl 1.1 x = 1;
221 : jsr166 1.15 assertEquals(1,a.getAndIncrement(this));
222 :     assertEquals(2,a.get(this));
223 :     a.set(this,-2);
224 :     assertEquals(-2,a.getAndIncrement(this));
225 :     assertEquals(-1,a.getAndIncrement(this));
226 :     assertEquals(0,a.getAndIncrement(this));
227 :     assertEquals(1,a.get(this));
228 : dl 1.1 }
229 :    
230 : dl 1.3 /**
231 : dl 1.4 * addAndGet adds given value to current, and returns current value
232 : dl 1.3 */
233 :     public void testAddAndGet() {
234 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
235 :     try {
236 :     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
237 :     } catch (RuntimeException ok) {
238 :     return;
239 :     }
240 : dl 1.1 x = 1;
241 : jsr166 1.15 assertEquals(3,a.addAndGet(this,2));
242 :     assertEquals(3,a.get(this));
243 :     assertEquals(-1,a.addAndGet(this,-4));
244 :     assertEquals(-1,a.get(this));
245 : dl 1.1 }
246 :    
247 : dl 1.3 /**
248 : dl 1.4 * decrementAndGet decrements and returns current value
249 : dl 1.3 */
250 :     public void testDecrementAndGet() {
251 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
252 :     try {
253 :     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
254 :     } catch (RuntimeException ok) {
255 :     return;
256 :     }
257 : dl 1.1 x = 1;
258 : jsr166 1.15 assertEquals(0,a.decrementAndGet(this));
259 :     assertEquals(-1,a.decrementAndGet(this));
260 :     assertEquals(-2,a.decrementAndGet(this));
261 :     assertEquals(-2,a.get(this));
262 : dl 1.1 }
263 :    
264 : dl 1.3 /**
265 : dl 1.4 * incrementAndGet increments and returns current value
266 : dl 1.3 */
267 :     public void testIncrementAndGet() {
268 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
269 :     try {
270 :     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
271 :     } catch (RuntimeException ok) {
272 :     return;
273 :     }
274 : dl 1.1 x = 1;
275 : jsr166 1.15 assertEquals(2,a.incrementAndGet(this));
276 :     assertEquals(2,a.get(this));
277 :     a.set(this,-2);
278 :     assertEquals(-1,a.incrementAndGet(this));
279 :     assertEquals(0,a.incrementAndGet(this));
280 :     assertEquals(1,a.incrementAndGet(this));
281 :     assertEquals(1,a.get(this));
282 : dl 1.1 }
283 :    
284 :     }

Doug Lea
ViewVC Help
Powered by ViewVC 1.0.8