ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AtomicMarkableReferenceTest.java
Revision: 1.24
Committed: Wed Jan 27 01:57:24 2021 UTC (3 years, 3 months ago) by jsr166
Branch: MAIN
CVS Tags: HEAD
Changes since 1.23: +8 -8 lines
Log Message:
use diamond <> pervasively

File Contents

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