ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AtomicLongFieldUpdaterTest.java
Revision: 1.21
Committed: Tue May 31 16:16:23 2011 UTC (12 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.20: +1 -2 lines
Log Message:
use serialClone in serialization tests; update imports

File Contents

# User Rev Content
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 junit.framework.*;
10 jsr166 1.21 import java.util.concurrent.atomic.AtomicLongFieldUpdater;
11 dl 1.1
12 dl 1.2 public class AtomicLongFieldUpdaterTest extends JSR166TestCase {
13 dl 1.1 volatile long x = 0;
14 dl 1.4 int z;
15     long w;
16 dl 1.1
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(AtomicLongFieldUpdaterTest.class);
22     }
23    
24 dl 1.3 /**
25 dl 1.7 * Construction with non-existent field throws RuntimeException
26 dl 1.3 */
27 jsr166 1.12 public void testConstructor() {
28 jsr166 1.11 try {
29 jsr166 1.10 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest>
30 dl 1.1 a = AtomicLongFieldUpdater.newUpdater
31 dl 1.5 (AtomicLongFieldUpdaterTest.class, "y");
32 dl 1.3 shouldThrow();
33 jsr166 1.16 } catch (RuntimeException success) {}
34 dl 1.1 }
35    
36 dl 1.3 /**
37 dl 1.4 * construction with field not of given type throws RuntimeException
38 dl 1.3 */
39 jsr166 1.12 public void testConstructor2() {
40 jsr166 1.11 try {
41 jsr166 1.10 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest>
42 dl 1.1 a = AtomicLongFieldUpdater.newUpdater
43 dl 1.5 (AtomicLongFieldUpdaterTest.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 dl 1.3 */
51 jsr166 1.12 public void testConstructor3() {
52 jsr166 1.11 try {
53 jsr166 1.10 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest>
54 dl 1.1 a = AtomicLongFieldUpdater.newUpdater
55 dl 1.5 (AtomicLongFieldUpdaterTest.class, "w");
56 dl 1.3 shouldThrow();
57 jsr166 1.16 } catch (RuntimeException success) {}
58 dl 1.1 }
59    
60 dl 1.3 /**
61 jsr166 1.18 * get returns the last value set or assigned
62 dl 1.3 */
63 jsr166 1.12 public void testGetSet() {
64 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
65     try {
66     a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.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 jsr166 1.12 public void testGetLazySet() {
82 dl 1.9 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
83     try {
84     a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.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 jsr166 1.12 public void testCompareAndSet() {
100 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
101     try {
102     a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.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 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest>a;
123     try {
124     a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.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(AtomicLongFieldUpdaterTest.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 jsr166 1.12 public void testWeakCompareAndSet() {
147 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
148     try {
149     a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.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 jsr166 1.11 while (!a.weakCompareAndSet(this,2,-4));
156 jsr166 1.15 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 jsr166 1.12 public void testGetAndSet() {
165 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
166     try {
167     a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.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 jsr166 1.12 public void testGetAndAdd() {
181 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
182     try {
183     a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.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 jsr166 1.12 public void testGetAndDecrement() {
198 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
199     try {
200     a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.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 jsr166 1.12 public void testGetAndIncrement() {
214 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
215     try {
216     a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.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 jsr166 1.12 public void testAddAndGet() {
234 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
235     try {
236     a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.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 jsr166 1.18 * decrementAndGet decrements and returns current value
249 dl 1.3 */
250 jsr166 1.12 public void testDecrementAndGet() {
251 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
252     try {
253     a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.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 jsr166 1.12 public void testIncrementAndGet() {
268 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
269     try {
270     a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.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     }