[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.6 - (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 :     * 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.4 * Contruction with non-existent field throws RuntimeException
26 : dl 1.3 */
27 :     public void testConstructor() {
28 : dl 1.1 try{
29 :     AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest>
30 :     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 : dl 1.2 try{
42 :     AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest>
43 :     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 :     try{
55 :     AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest>
56 :     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.5 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
68 : dl 1.1 x = 1;
69 :     assertEquals(1,a.get(this));
70 :     a.set(this,2);
71 :     assertEquals(2,a.get(this));
72 :     a.set(this,-3);
73 :     assertEquals(-3,a.get(this));
74 :    
75 :     }
76 : dl 1.3 /**
77 : dl 1.4 * compareAndSet succeeds in changing value if equal to expected else fails
78 : dl 1.3 */
79 :     public void testCompareAndSet() {
80 : dl 1.5 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
81 : dl 1.1 x = 1;
82 :     assertTrue(a.compareAndSet(this,1,2));
83 :     assertTrue(a.compareAndSet(this,2,-4));
84 :     assertEquals(-4,a.get(this));
85 :     assertFalse(a.compareAndSet(this,-5,7));
86 :     assertFalse((7 == a.get(this)));
87 :     assertTrue(a.compareAndSet(this,-4,7));
88 :     assertEquals(7,a.get(this));
89 :     }
90 :    
91 : dl 1.4
92 :     /**
93 :     * compareAndSet in one thread enables another waiting for value
94 :     * to succeed
95 :     */
96 :     public void testCompareAndSetInMultipleThreads() {
97 :     x = 1;
98 : dl 1.5 final AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest>a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
99 : dl 1.4
100 :     Thread t = new Thread(new Runnable() {
101 :     public void run() {
102 :     while(!a.compareAndSet(AtomicIntegerFieldUpdaterTest.this, 2, 3)) Thread.yield();
103 :     }});
104 :     try {
105 :     t.start();
106 :     assertTrue(a.compareAndSet(this, 1, 2));
107 :     t.join(LONG_DELAY_MS);
108 :     assertFalse(t.isAlive());
109 :     assertEquals(a.get(this), 3);
110 :     }
111 :     catch(Exception e) {
112 :     unexpectedException();
113 :     }
114 :     }
115 :    
116 : dl 1.3 /**
117 : dl 1.4 * repeated weakCompareAndSet succeeds in changing value when equal
118 :     * to expected
119 : dl 1.3 */
120 :     public void testWeakCompareAndSet() {
121 : dl 1.5 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
122 : dl 1.1 x = 1;
123 :     while(!a.weakCompareAndSet(this,1,2));
124 :     while(!a.weakCompareAndSet(this,2,-4));
125 :     assertEquals(-4,a.get(this));
126 :     while(!a.weakCompareAndSet(this,-4,7));
127 :     assertEquals(7,a.get(this));
128 :     }
129 :    
130 : dl 1.3 /**
131 : dl 1.4 * getAndSet returns previous value and sets to given value
132 : dl 1.3 */
133 :     public void testGetAndSet() {
134 : dl 1.5 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
135 : dl 1.1 x = 1;
136 :     assertEquals(1,a.getAndSet(this, 0));
137 :     assertEquals(0,a.getAndSet(this,-10));
138 :     assertEquals(-10,a.getAndSet(this,1));
139 :     }
140 :    
141 : dl 1.3 /**
142 : dl 1.4 * getAndAdd returns previous value and adds given value
143 : dl 1.3 */
144 :     public void testGetAndAdd() {
145 : dl 1.5 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
146 : dl 1.1 x = 1;
147 :     assertEquals(1,a.getAndAdd(this,2));
148 :     assertEquals(3,a.get(this));
149 :     assertEquals(3,a.getAndAdd(this,-4));
150 :     assertEquals(-1,a.get(this));
151 :     }
152 :    
153 : dl 1.3 /**
154 : dl 1.4 * getAndDecrement returns previous value and decrements
155 : dl 1.3 */
156 :     public void testGetAndDecrement() {
157 : dl 1.5 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
158 : dl 1.1 x = 1;
159 :     assertEquals(1,a.getAndDecrement(this));
160 :     assertEquals(0,a.getAndDecrement(this));
161 :     assertEquals(-1,a.getAndDecrement(this));
162 :     }
163 :    
164 : dl 1.3 /**
165 : dl 1.4 * getAndIncrement returns previous value and increments
166 : dl 1.3 */
167 :     public void testGetAndIncrement() {
168 : dl 1.5 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
169 : dl 1.1 x = 1;
170 :     assertEquals(1,a.getAndIncrement(this));
171 :     assertEquals(2,a.get(this));
172 :     a.set(this,-2);
173 :     assertEquals(-2,a.getAndIncrement(this));
174 :     assertEquals(-1,a.getAndIncrement(this));
175 :     assertEquals(0,a.getAndIncrement(this));
176 :     assertEquals(1,a.get(this));
177 :     }
178 :    
179 : dl 1.3 /**
180 : dl 1.4 * addAndGet adds given value to current, and returns current value
181 : dl 1.3 */
182 :     public void testAddAndGet() {
183 : dl 1.5 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
184 : dl 1.1 x = 1;
185 :     assertEquals(3,a.addAndGet(this,2));
186 :     assertEquals(3,a.get(this));
187 :     assertEquals(-1,a.addAndGet(this,-4));
188 :     assertEquals(-1,a.get(this));
189 :     }
190 :    
191 : dl 1.3 /**
192 : dl 1.4 * decrementAndGet decrements and returns current value
193 : dl 1.3 */
194 :     public void testDecrementAndGet() {
195 : dl 1.5 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
196 : dl 1.1 x = 1;
197 :     assertEquals(0,a.decrementAndGet(this));
198 :     assertEquals(-1,a.decrementAndGet(this));
199 :     assertEquals(-2,a.decrementAndGet(this));
200 :     assertEquals(-2,a.get(this));
201 :     }
202 :    
203 : dl 1.3 /**
204 : dl 1.4 * incrementAndGet increments and returns current value
205 : dl 1.3 */
206 :     public void testIncrementAndGet() {
207 : dl 1.5 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
208 : dl 1.1 x = 1;
209 :     assertEquals(2,a.incrementAndGet(this));
210 :     assertEquals(2,a.get(this));
211 :     a.set(this,-2);
212 :     assertEquals(-1,a.incrementAndGet(this));
213 :     assertEquals(0,a.incrementAndGet(this));
214 :     assertEquals(1,a.incrementAndGet(this));
215 :     assertEquals(1,a.get(this));
216 :     }
217 :    
218 :     }

Doug Lea
ViewVC Help
Powered by ViewVC 1.0.8