Home | History | Annotate | Download | only in jsr166
      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 package jsr166;
     10 
     11 import java.util.concurrent.atomic.AtomicStampedReference;
     12 
     13 import junit.framework.Test;
     14 import junit.framework.TestSuite;
     15 
     16 public class AtomicStampedReferenceTest extends JSR166TestCase {
     17     // android-note: Removed because the CTS runner does a bad job of
     18     // retrying tests that have suite() declarations.
     19     //
     20     // public static void main(String[] args) {
     21     //     main(suite(), args);
     22     // }
     23     // public static Test suite() {
     24     //     return new TestSuite(AtomicStampedReferenceTest.class);
     25     // }
     26 
     27     /**
     28      * constructor initializes to given reference and stamp
     29      */
     30     public void testConstructor() {
     31         AtomicStampedReference ai = new AtomicStampedReference(one, 0);
     32         assertSame(one, ai.getReference());
     33         assertEquals(0, ai.getStamp());
     34         AtomicStampedReference a2 = new AtomicStampedReference(null, 1);
     35         assertNull(a2.getReference());
     36         assertEquals(1, a2.getStamp());
     37     }
     38 
     39     /**
     40      * get returns the last values of reference and stamp set
     41      */
     42     public void testGetSet() {
     43         int[] mark = new int[1];
     44         AtomicStampedReference ai = new AtomicStampedReference(one, 0);
     45         assertSame(one, ai.getReference());
     46         assertEquals(0, ai.getStamp());
     47         assertSame(one, ai.get(mark));
     48         assertEquals(0, mark[0]);
     49         ai.set(two, 0);
     50         assertSame(two, ai.getReference());
     51         assertEquals(0, ai.getStamp());
     52         assertSame(two, ai.get(mark));
     53         assertEquals(0, mark[0]);
     54         ai.set(one, 1);
     55         assertSame(one, ai.getReference());
     56         assertEquals(1, ai.getStamp());
     57         assertSame(one, ai.get(mark));
     58         assertEquals(1, mark[0]);
     59     }
     60 
     61     /**
     62      * attemptStamp succeeds in single thread
     63      */
     64     public void testAttemptStamp() {
     65         int[] mark = new int[1];
     66         AtomicStampedReference ai = new AtomicStampedReference(one, 0);
     67         assertEquals(0, ai.getStamp());
     68         assertTrue(ai.attemptStamp(one, 1));
     69         assertEquals(1, ai.getStamp());
     70         assertSame(one, ai.get(mark));
     71         assertEquals(1, mark[0]);
     72     }
     73 
     74     /**
     75      * compareAndSet succeeds in changing values if equal to expected reference
     76      * and stamp else fails
     77      */
     78     public void testCompareAndSet() {
     79         int[] mark = new int[1];
     80         AtomicStampedReference ai = new AtomicStampedReference(one, 0);
     81         assertSame(one, ai.get(mark));
     82         assertEquals(0, ai.getStamp());
     83         assertEquals(0, mark[0]);
     84 
     85         assertTrue(ai.compareAndSet(one, two, 0, 0));
     86         assertSame(two, ai.get(mark));
     87         assertEquals(0, mark[0]);
     88 
     89         assertTrue(ai.compareAndSet(two, m3, 0, 1));
     90         assertSame(m3, ai.get(mark));
     91         assertEquals(1, mark[0]);
     92 
     93         assertFalse(ai.compareAndSet(two, m3, 1, 1));
     94         assertSame(m3, ai.get(mark));
     95         assertEquals(1, mark[0]);
     96     }
     97 
     98     /**
     99      * compareAndSet in one thread enables another waiting for reference value
    100      * to succeed
    101      */
    102     public void testCompareAndSetInMultipleThreads() throws Exception {
    103         final AtomicStampedReference ai = new AtomicStampedReference(one, 0);
    104         Thread t = new Thread(new CheckedRunnable() {
    105             public void realRun() {
    106                 while (!ai.compareAndSet(two, three, 0, 0))
    107                     Thread.yield();
    108             }});
    109 
    110         t.start();
    111         assertTrue(ai.compareAndSet(one, two, 0, 0));
    112         t.join(LONG_DELAY_MS);
    113         assertFalse(t.isAlive());
    114         assertSame(three, ai.getReference());
    115         assertEquals(0, ai.getStamp());
    116     }
    117 
    118     /**
    119      * compareAndSet in one thread enables another waiting for stamp value
    120      * to succeed
    121      */
    122     public void testCompareAndSetInMultipleThreads2() throws Exception {
    123         final AtomicStampedReference ai = new AtomicStampedReference(one, 0);
    124         Thread t = new Thread(new CheckedRunnable() {
    125             public void realRun() {
    126                 while (!ai.compareAndSet(one, one, 1, 2))
    127                     Thread.yield();
    128             }});
    129 
    130         t.start();
    131         assertTrue(ai.compareAndSet(one, one, 0, 1));
    132         t.join(LONG_DELAY_MS);
    133         assertFalse(t.isAlive());
    134         assertSame(one, ai.getReference());
    135         assertEquals(2, ai.getStamp());
    136     }
    137 
    138     /**
    139      * repeated weakCompareAndSet succeeds in changing values when equal
    140      * to expected
    141      */
    142     public void testWeakCompareAndSet() {
    143         int[] mark = new int[1];
    144         AtomicStampedReference ai = new AtomicStampedReference(one, 0);
    145         assertSame(one, ai.get(mark));
    146         assertEquals(0, ai.getStamp());
    147         assertEquals(0, mark[0]);
    148 
    149         do {} while (!ai.weakCompareAndSet(one, two, 0, 0));
    150         assertSame(two, ai.get(mark));
    151         assertEquals(0, mark[0]);
    152 
    153         do {} while (!ai.weakCompareAndSet(two, m3, 0, 1));
    154         assertSame(m3, ai.get(mark));
    155         assertEquals(1, mark[0]);
    156     }
    157 
    158 }
    159