[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.13 - (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 : 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 : 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 : jsr166 1.13 public void testCompareAndSetInMultipleThreads() throws Exception {
127 : dl 1.4 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 : jsr166 1.13
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 : dl 1.4 }
146 :    
147 : dl 1.3 /**
148 : dl 1.4 * repeated weakCompareAndSet succeeds in changing value when equal
149 : jsr166 1.10 * to expected
150 : dl 1.3 */
151 :     public void testWeakCompareAndSet() {
152 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
153 :     try {
154 :     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
155 :     } catch (RuntimeException ok) {
156 :     return;
157 :     }
158 : dl 1.1 x = 1;
159 : jsr166 1.11 while (!a.weakCompareAndSet(this,1,2));
160 :     while (!a.weakCompareAndSet(this,2,-4));
161 : dl 1.1 assertEquals(-4,a.get(this));
162 : jsr166 1.11 while (!a.weakCompareAndSet(this,-4,7));
163 : dl 1.1 assertEquals(7,a.get(this));
164 :     }
165 :    
166 : dl 1.3 /**
167 : dl 1.4 * getAndSet returns previous value and sets to given value
168 : dl 1.3 */
169 :     public void testGetAndSet() {
170 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
171 :     try {
172 :     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
173 :     } catch (RuntimeException ok) {
174 :     return;
175 :     }
176 : dl 1.1 x = 1;
177 :     assertEquals(1,a.getAndSet(this, 0));
178 :     assertEquals(0,a.getAndSet(this,-10));
179 :     assertEquals(-10,a.getAndSet(this,1));
180 :     }
181 :    
182 : dl 1.3 /**
183 : dl 1.4 * getAndAdd returns previous value and adds given value
184 : dl 1.3 */
185 :     public void testGetAndAdd() {
186 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
187 :     try {
188 :     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
189 :     } catch (RuntimeException ok) {
190 :     return;
191 :     }
192 : dl 1.1 x = 1;
193 :     assertEquals(1,a.getAndAdd(this,2));
194 :     assertEquals(3,a.get(this));
195 :     assertEquals(3,a.getAndAdd(this,-4));
196 :     assertEquals(-1,a.get(this));
197 :     }
198 :    
199 : dl 1.3 /**
200 : dl 1.4 * getAndDecrement returns previous value and decrements
201 : dl 1.3 */
202 :     public void testGetAndDecrement() {
203 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
204 :     try {
205 :     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
206 :     } catch (RuntimeException ok) {
207 :     return;
208 :     }
209 : dl 1.1 x = 1;
210 :     assertEquals(1,a.getAndDecrement(this));
211 :     assertEquals(0,a.getAndDecrement(this));
212 :     assertEquals(-1,a.getAndDecrement(this));
213 :     }
214 :    
215 : dl 1.3 /**
216 : dl 1.4 * getAndIncrement returns previous value and increments
217 : dl 1.3 */
218 :     public void testGetAndIncrement() {
219 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
220 :     try {
221 :     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
222 :     } catch (RuntimeException ok) {
223 :     return;
224 :     }
225 : dl 1.1 x = 1;
226 :     assertEquals(1,a.getAndIncrement(this));
227 :     assertEquals(2,a.get(this));
228 :     a.set(this,-2);
229 :     assertEquals(-2,a.getAndIncrement(this));
230 :     assertEquals(-1,a.getAndIncrement(this));
231 :     assertEquals(0,a.getAndIncrement(this));
232 :     assertEquals(1,a.get(this));
233 :     }
234 :    
235 : dl 1.3 /**
236 : dl 1.4 * addAndGet adds given value to current, and returns current value
237 : dl 1.3 */
238 :     public void testAddAndGet() {
239 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
240 :     try {
241 :     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
242 :     } catch (RuntimeException ok) {
243 :     return;
244 :     }
245 : dl 1.1 x = 1;
246 :     assertEquals(3,a.addAndGet(this,2));
247 :     assertEquals(3,a.get(this));
248 :     assertEquals(-1,a.addAndGet(this,-4));
249 :     assertEquals(-1,a.get(this));
250 :     }
251 :    
252 : dl 1.3 /**
253 : dl 1.4 * decrementAndGet decrements and returns current value
254 : dl 1.3 */
255 :     public void testDecrementAndGet() {
256 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
257 :     try {
258 :     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
259 :     } catch (RuntimeException ok) {
260 :     return;
261 :     }
262 : dl 1.1 x = 1;
263 :     assertEquals(0,a.decrementAndGet(this));
264 :     assertEquals(-1,a.decrementAndGet(this));
265 :     assertEquals(-2,a.decrementAndGet(this));
266 :     assertEquals(-2,a.get(this));
267 :     }
268 :    
269 : dl 1.3 /**
270 : dl 1.4 * incrementAndGet increments and returns current value
271 : dl 1.3 */
272 :     public void testIncrementAndGet() {
273 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
274 :     try {
275 :     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
276 :     } catch (RuntimeException ok) {
277 :     return;
278 :     }
279 : dl 1.1 x = 1;
280 :     assertEquals(2,a.incrementAndGet(this));
281 :     assertEquals(2,a.get(this));
282 :     a.set(this,-2);
283 :     assertEquals(-1,a.incrementAndGet(this));
284 :     assertEquals(0,a.incrementAndGet(this));
285 :     assertEquals(1,a.incrementAndGet(this));
286 :     assertEquals(1,a.get(this));
287 :     }
288 :    
289 :     }

Doug Lea
ViewVC Help
Powered by ViewVC 1.0.8