ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AtomicStampedReferenceTest.java
Revision: 1.15
Committed: Wed Aug 25 00:07:03 2010 UTC (13 years, 8 months ago) by jsr166
Branch: MAIN
Changes since 1.14: +3 -3 lines
Log Message:
whitespace

File Contents

# User Rev Content
1 dl 1.1 /*
2 dl 1.5 * 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.8 * Other contributors include Andrew Wright, Jeffrey Hayes,
6     * Pat Fisher, Mike Judd.
7 dl 1.5 */
8 dl 1.1
9     import junit.framework.*;
10     import java.util.concurrent.atomic.*;
11    
12 jsr166 1.10 public class AtomicStampedReferenceTest extends JSR166TestCase {
13 jsr166 1.15 public static void main(String[] args) {
14     junit.textui.TestRunner.run(suite());
15 dl 1.1 }
16     public static Test suite() {
17     return new TestSuite(AtomicStampedReferenceTest.class);
18     }
19 jsr166 1.8
20 dl 1.3 /**
21 dl 1.7 * constructor initializes to given reference and stamp
22 dl 1.3 */
23 jsr166 1.10 public void testConstructor() {
24 dl 1.1 AtomicStampedReference ai = new AtomicStampedReference(one, 0);
25 jsr166 1.14 assertSame(one,ai.getReference());
26 jsr166 1.13 assertEquals(0, ai.getStamp());
27 dl 1.1 AtomicStampedReference a2 = new AtomicStampedReference(null, 1);
28 jsr166 1.13 assertNull(a2.getReference());
29     assertEquals(1, a2.getStamp());
30 dl 1.1 }
31    
32 dl 1.3 /**
33 dl 1.4 * get returns the last values of reference and stamp set
34 dl 1.3 */
35 jsr166 1.10 public void testGetSet() {
36 dl 1.1 int[] mark = new int[1];
37     AtomicStampedReference ai = new AtomicStampedReference(one, 0);
38 jsr166 1.14 assertSame(one,ai.getReference());
39 jsr166 1.13 assertEquals(0, ai.getStamp());
40 jsr166 1.14 assertSame(one, ai.get(mark));
41 dl 1.1 assertEquals(0, mark[0]);
42 jsr166 1.13 ai.set(two, 0);
43 jsr166 1.14 assertSame(two,ai.getReference());
44 jsr166 1.13 assertEquals(0, ai.getStamp());
45 jsr166 1.14 assertSame(two, ai.get(mark));
46 dl 1.1 assertEquals(0, mark[0]);
47 jsr166 1.13 ai.set(one, 1);
48 jsr166 1.14 assertSame(one,ai.getReference());
49 jsr166 1.13 assertEquals(1, ai.getStamp());
50 jsr166 1.14 assertSame(one, ai.get(mark));
51 dl 1.1 assertEquals(1,mark[0]);
52     }
53    
54 dl 1.3 /**
55 dl 1.4 * attemptStamp succeeds in single thread
56 dl 1.3 */
57 jsr166 1.10 public void testAttemptStamp() {
58 dl 1.1 int[] mark = new int[1];
59     AtomicStampedReference ai = new AtomicStampedReference(one, 0);
60     assertEquals(0, ai.getStamp());
61     assertTrue(ai.attemptStamp(one, 1));
62 jsr166 1.13 assertEquals(1, ai.getStamp());
63 jsr166 1.14 assertSame(one, ai.get(mark));
64 dl 1.1 assertEquals(1, mark[0]);
65     }
66    
67 dl 1.3 /**
68 dl 1.4 * compareAndSet succeeds in changing values if equal to expected reference
69     * and stamp else fails
70 dl 1.3 */
71 jsr166 1.10 public void testCompareAndSet() {
72 dl 1.1 int[] mark = new int[1];
73     AtomicStampedReference ai = new AtomicStampedReference(one, 0);
74 jsr166 1.14 assertSame(one, ai.get(mark));
75 dl 1.1 assertEquals(0, ai.getStamp());
76 jsr166 1.13 assertEquals(0, mark[0]);
77 dl 1.1
78     assertTrue(ai.compareAndSet(one, two, 0, 0));
79 jsr166 1.14 assertSame(two, ai.get(mark));
80 jsr166 1.13 assertEquals(0, mark[0]);
81 dl 1.1
82     assertTrue(ai.compareAndSet(two, m3, 0, 1));
83 jsr166 1.14 assertSame(m3, ai.get(mark));
84 jsr166 1.13 assertEquals(1, mark[0]);
85 dl 1.1
86     assertFalse(ai.compareAndSet(two, m3, 1, 1));
87 jsr166 1.14 assertSame(m3, ai.get(mark));
88 jsr166 1.13 assertEquals(1, mark[0]);
89 dl 1.1 }
90    
91 dl 1.3 /**
92 dl 1.4 * compareAndSet in one thread enables another waiting for reference value
93     * to succeed
94     */
95 jsr166 1.11 public void testCompareAndSetInMultipleThreads() throws Exception {
96 dl 1.4 final AtomicStampedReference ai = new AtomicStampedReference(one, 0);
97 jsr166 1.12 Thread t = new Thread(new CheckedRunnable() {
98     public void realRun() {
99     while (!ai.compareAndSet(two, three, 0, 0))
100     Thread.yield();
101     }});
102 jsr166 1.11
103     t.start();
104     assertTrue(ai.compareAndSet(one, two, 0, 0));
105     t.join(LONG_DELAY_MS);
106     assertFalse(t.isAlive());
107 jsr166 1.14 assertSame(ai.getReference(), three);
108 jsr166 1.11 assertEquals(ai.getStamp(), 0);
109 dl 1.4 }
110    
111     /**
112     * compareAndSet in one thread enables another waiting for stamp value
113     * to succeed
114     */
115 jsr166 1.11 public void testCompareAndSetInMultipleThreads2() throws Exception {
116 dl 1.4 final AtomicStampedReference ai = new AtomicStampedReference(one, 0);
117 jsr166 1.12 Thread t = new Thread(new CheckedRunnable() {
118     public void realRun() {
119     while (!ai.compareAndSet(one, one, 1, 2))
120     Thread.yield();
121     }});
122 jsr166 1.11
123     t.start();
124     assertTrue(ai.compareAndSet(one, one, 0, 1));
125     t.join(LONG_DELAY_MS);
126     assertFalse(t.isAlive());
127 jsr166 1.14 assertSame(ai.getReference(), one);
128 jsr166 1.11 assertEquals(ai.getStamp(), 2);
129 dl 1.4 }
130    
131     /**
132     * repeated weakCompareAndSet succeeds in changing values when equal
133 jsr166 1.8 * to expected
134 dl 1.3 */
135 jsr166 1.10 public void testWeakCompareAndSet() {
136 dl 1.1 int[] mark = new int[1];
137     AtomicStampedReference ai = new AtomicStampedReference(one, 0);
138 jsr166 1.14 assertSame(one, ai.get(mark));
139 jsr166 1.15 assertEquals(0, ai.getStamp());
140 jsr166 1.13 assertEquals(0, mark[0]);
141 dl 1.1
142 jsr166 1.9 while (!ai.weakCompareAndSet(one, two, 0, 0));
143 jsr166 1.14 assertSame(two, ai.get(mark));
144 jsr166 1.13 assertEquals(0, mark[0]);
145 dl 1.1
146 jsr166 1.9 while (!ai.weakCompareAndSet(two, m3, 0, 1));
147 jsr166 1.14 assertSame(m3, ai.get(mark));
148 jsr166 1.13 assertEquals(1, mark[0]);
149 dl 1.1 }
150    
151     }