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

Doug Lea
ViewVC Help
Powered by ViewVC 1.0.8