rt/emul/compacttest/src/test/java/org/apidesign/bck2brwsr/tck/AtomicTest.java
changeset 1779 9d757281c666
parent 1723 3a1f262311cf
child 1787 ea12a3bb4b33
     1.1 --- a/rt/emul/compacttest/src/test/java/org/apidesign/bck2brwsr/tck/AtomicTest.java	Wed Nov 19 19:32:00 2014 +0100
     1.2 +++ b/rt/emul/compacttest/src/test/java/org/apidesign/bck2brwsr/tck/AtomicTest.java	Mon Feb 09 20:36:12 2015 +0100
     1.3 @@ -19,7 +19,10 @@
     1.4  
     1.5  import java.util.concurrent.atomic.AtomicBoolean;
     1.6  import java.util.concurrent.atomic.AtomicInteger;
     1.7 +import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
     1.8 +import java.util.concurrent.atomic.AtomicLongFieldUpdater;
     1.9  import java.util.concurrent.atomic.AtomicReference;
    1.10 +import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
    1.11  import org.apidesign.bck2brwsr.vmtest.Compare;
    1.12  import org.apidesign.bck2brwsr.vmtest.VMTest;
    1.13  import org.testng.annotations.Factory;
    1.14 @@ -29,6 +32,31 @@
    1.15   * @author Jaroslav Tulach <jtulach@netbeans.org>
    1.16   */
    1.17  public class AtomicTest {
    1.18 +    private volatile int intValue;
    1.19 +    private static AtomicIntegerFieldUpdater<AtomicTest> intUpdater;
    1.20 +    static AtomicIntegerFieldUpdater<AtomicTest> getIntUpdater() {
    1.21 +        if (intUpdater == null) {
    1.22 +            intUpdater = AtomicIntegerFieldUpdater.newUpdater(AtomicTest.class, "intValue");
    1.23 +        }
    1.24 +        return intUpdater;
    1.25 +    }
    1.26 +    private volatile long longValue;
    1.27 +    private static AtomicLongFieldUpdater<AtomicTest> longUpdater;
    1.28 +    static AtomicLongFieldUpdater<AtomicTest> getLongUpdater() {
    1.29 +        if (longUpdater == null) {
    1.30 +            longUpdater = AtomicLongFieldUpdater.newUpdater(AtomicTest.class, "longValue");
    1.31 +        }
    1.32 +        return longUpdater;
    1.33 +    }
    1.34 +    private volatile Number refValue;
    1.35 +    private static AtomicReferenceFieldUpdater<AtomicTest,Number> refUpdater;
    1.36 +    static AtomicReferenceFieldUpdater<AtomicTest,Number> getRefUpdater() {
    1.37 +        if (refUpdater == null) {
    1.38 +            refUpdater = AtomicReferenceFieldUpdater.newUpdater(AtomicTest.class, Number.class, "refValue");
    1.39 +        }
    1.40 +        return refUpdater;
    1.41 +    }
    1.42 +    
    1.43      @Compare public boolean atomicBoolean() {
    1.44          AtomicBoolean ab = new AtomicBoolean();
    1.45          ab.set(true);
    1.46 @@ -48,6 +76,32 @@
    1.47          return ar.getAndSet("Other");
    1.48      }
    1.49      
    1.50 +    @Compare public int intUpdater() {
    1.51 +        intValue = Integer.MAX_VALUE / 2;
    1.52 +        final AtomicIntegerFieldUpdater<AtomicTest> u = getIntUpdater();
    1.53 +        u.compareAndSet(this, 0, 10);
    1.54 +        u.addAndGet(this, 3);
    1.55 +        int thirteen = u.getAndAdd(this, 7);
    1.56 +        return thirteen + u.get(this);
    1.57 +    }
    1.58 +
    1.59 +    @Compare public long longUpdater() {
    1.60 +        longValue = Long.MAX_VALUE / 2;
    1.61 +        final AtomicLongFieldUpdater<AtomicTest> u = getLongUpdater();
    1.62 +        u.compareAndSet(this, 0, 10);
    1.63 +        u.addAndGet(this, 3);
    1.64 +        long thirteen = u.getAndAdd(this, 7);
    1.65 +        return thirteen + u.get(this);
    1.66 +    }
    1.67 +
    1.68 +    @Compare public int refUpdater() {
    1.69 +        final AtomicReferenceFieldUpdater<AtomicTest,Number> u = getRefUpdater();
    1.70 +        u.set(this, 0);
    1.71 +        u.compareAndSet(this, 0, 10);
    1.72 +        Number ten = u.getAndSet(this, 3);
    1.73 +        return u.get(this).intValue() + ten.intValue();
    1.74 +    }
    1.75 +    
    1.76      @Factory public static Object[] create() {
    1.77          return VMTest.create(AtomicTest.class);
    1.78      }