AtomicBooleanTest.java revision 8f0d92bba199d906c70a5e40d7f3516c1a424117
18f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle/*
28f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Written by Doug Lea with assistance from members of JCP JSR-166
38f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Expert Group and released to the public domain, as explained at
48f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * http://creativecommons.org/publicdomain/zero/1.0/
58f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Other contributors include Andrew Wright, Jeffrey Hayes,
68f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Pat Fisher, Mike Judd.
78f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */
88f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
98f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepackage jsr166;
108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport junit.framework.*;
128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.atomic.AtomicBoolean;
138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepublic class AtomicBooleanTest extends JSR166TestCase {
158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * constructor initializes to given value
188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor() {
208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(new AtomicBoolean(true).get());
218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(new AtomicBoolean(false).get());
228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * default constructed initializes to false
268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor2() {
288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        AtomicBoolean ai = new AtomicBoolean();
298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(ai.get());
308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * get returns the last value set
348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetSet() {
368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        AtomicBoolean ai = new AtomicBoolean(true);
378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(ai.get());
388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ai.set(false);
398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(ai.get());
408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ai.set(true);
418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(ai.get());
428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * get returns the last value lazySet in same thread
468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetLazySet() {
488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        AtomicBoolean ai = new AtomicBoolean(true);
498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(ai.get());
508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ai.lazySet(false);
518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(ai.get());
528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ai.lazySet(true);
538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(ai.get());
548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * compareAndSet succeeds in changing value if equal to expected else fails
588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCompareAndSet() {
608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        AtomicBoolean ai = new AtomicBoolean(true);
618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(ai.compareAndSet(true, false));
628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(ai.get());
638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(ai.compareAndSet(false, false));
648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(ai.get());
658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(ai.compareAndSet(true, false));
668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(ai.get());
678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(ai.compareAndSet(false, true));
688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(ai.get());
698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * compareAndSet in one thread enables another waiting for value
738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * to succeed
748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCompareAndSetInMultipleThreads() throws Exception {
768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final AtomicBoolean ai = new AtomicBoolean(true);
778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = new Thread(new CheckedRunnable() {
788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() {
798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                while (!ai.compareAndSet(false, true)) Thread.yield();
808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.start();
838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(ai.compareAndSet(true, false));
848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.join(LONG_DELAY_MS);
858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(t.isAlive());
868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * repeated weakCompareAndSet succeeds in changing value when equal
908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * to expected
918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testWeakCompareAndSet() {
938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        AtomicBoolean ai = new AtomicBoolean(true);
948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        while (!ai.weakCompareAndSet(true, false));
958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(ai.get());
968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        while (!ai.weakCompareAndSet(false, false));
978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(ai.get());
988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        while (!ai.weakCompareAndSet(false, true));
998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(ai.get());
1008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getAndSet returns previous value and sets to given value
1048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetAndSet() {
1068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        AtomicBoolean ai = new AtomicBoolean(true);
1078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(true, ai.getAndSet(false));
1088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(false, ai.getAndSet(false));
1098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(false, ai.getAndSet(true));
1108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(ai.get());
1118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * a deserialized serialized atomic holds same value
1158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSerialization() throws Exception {
1178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        AtomicBoolean x = new AtomicBoolean();
1188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        AtomicBoolean y = serialClone(x);
1198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        x.set(true);
1208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        AtomicBoolean z = serialClone(x);
1218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(x.get());
1228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(y.get());
1238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(z.get());
1248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * toString returns current value.
1288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToString() {
1308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        AtomicBoolean ai = new AtomicBoolean();
1318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(Boolean.toString(false), ai.toString());
1328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ai.set(true);
1338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(Boolean.toString(true), ai.toString());
1348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}
137