/** repeated weakCompareAndSet succeeds in changing value when equal to expected */ public void testWeakCompareAndSet() { double prev = Math.E; double unused = Math.E + Math.PI; AtomicDouble at = new AtomicDouble(prev); for (double x : VALUES) { assertBitEquals(prev, at.get()); assertFalse(at.weakCompareAndSet(unused, x)); assertBitEquals(prev, at.get()); while (!at.weakCompareAndSet(prev, x)) {; } assertBitEquals(x, at.get()); prev = x; } }
/** compareAndSet treats +0.0 and -0.0 as distinct values */ public void testDistinctZeros() { AtomicDouble at = new AtomicDouble(+0.0); assertFalse(at.compareAndSet(-0.0, 7.0)); assertFalse(at.weakCompareAndSet(-0.0, 7.0)); assertBitEquals(+0.0, at.get()); assertTrue(at.compareAndSet(+0.0, -0.0)); assertBitEquals(-0.0, at.get()); assertFalse(at.compareAndSet(+0.0, 7.0)); assertFalse(at.weakCompareAndSet(+0.0, 7.0)); assertBitEquals(-0.0, at.get()); } }
// while the update appears bigger than the atomic, try to update the atomic. private void max(AtomicDouble atomicDouble, double update) { double expect = atomicDouble.get(); while (update > expect) { atomicDouble.weakCompareAndSet(expect, update); expect = atomicDouble.get(); } }
/** * repeated weakCompareAndSet succeeds in changing value when equal * to expected */ public void testWeakCompareAndSet() { double prev = Math.E; double unused = Math.E + Math.PI; AtomicDouble at = new AtomicDouble(prev); for (double x : VALUES) { assertBitEquals(prev, at.get()); assertFalse(at.weakCompareAndSet(unused, x)); assertBitEquals(prev, at.get()); while (!at.weakCompareAndSet(prev, x)) { ; } assertBitEquals(x, at.get()); prev = x; } }
/** * compareAndSet treats +0.0 and -0.0 as distinct values */ public void testDistinctZeros() { AtomicDouble at = new AtomicDouble(+0.0); assertFalse(at.compareAndSet(-0.0, 7.0)); assertFalse(at.weakCompareAndSet(-0.0, 7.0)); assertBitEquals(+0.0, at.get()); assertTrue(at.compareAndSet(+0.0, -0.0)); assertBitEquals(-0.0, at.get()); assertFalse(at.compareAndSet(+0.0, 7.0)); assertFalse(at.weakCompareAndSet(+0.0, 7.0)); assertBitEquals(-0.0, at.get()); } }