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

Doug Lea
ViewVC Help
Powered by ViewVC 1.0.8