11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/* 21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Written by Doug Lea and Martin Buchholz with assistance from 31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * members of JCP JSR-166 Expert Group and released to the public 41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * domain, as explained at 51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://creativecommons.org/publicdomain/zero/1.0/ 61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/* 91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Source: 101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/src/jsr166e/extra/AtomicDouble.java?revision=1.13 111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * (Modified to adapt to guava coding conventions and 121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * to use AtomicLongFieldUpdater instead of sun.misc.Unsafe) 131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.util.concurrent; 161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.Beta; 181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.lang.Double.doubleToRawLongBits; 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.lang.Double.longBitsToDouble; 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.concurrent.atomic.AtomicLongFieldUpdater; 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A {@code double} value that may be updated atomically. See the 251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link java.util.concurrent.atomic} package specification for 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * description of the properties of atomic variables. An {@code 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * AtomicDouble} is used in applications such as atomic accumulation, 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * and cannot be used as a replacement for a {@link Double}. However, 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * this class does extend {@code Number} to allow uniform access by 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * tools and utilities that deal with numerically-based classes. 311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><a name="bitEquals">This class compares primitive {@code double} 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * values in methods such as {@link #compareAndSet} by comparing their 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * bitwise representation using {@link Double#doubleToRawLongBits}, 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * which differs from both the primitive double {@code ==} operator 361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * and from {@link Double#equals}, as if implemented by: 371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <pre> {@code 381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * static boolean bitEquals(double x, double y) { 391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * long xBits = Double.doubleToRawLongBits(x); 401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * long yBits = Double.doubleToRawLongBits(y); 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * return xBits == yBits; 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * }}</pre> 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>It is possible to write a more scalable updater, at the cost of 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * giving up strict atomicity. See for example 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <a href="http://gee.cs.oswego.edu/dl/jsr166/dist/jsr166edocs/jsr166e/DoubleAdder.html" 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * DoubleAdder> 481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * and 491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <a href="http://gee.cs.oswego.edu/dl/jsr166/dist/jsr166edocs/jsr166e/DoubleMaxUpdater.html" 501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * DoubleMaxUpdater>. 511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Doug Lea 531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Martin Buchholz 541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 11.0 551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@Beta 571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class AtomicDouble extends Number implements java.io.Serializable { 581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final long serialVersionUID = 0L; 591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private transient volatile long value; 611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final AtomicLongFieldUpdater<AtomicDouble> updater = 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert AtomicLongFieldUpdater.newUpdater(AtomicDouble.class, "value"); 641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Creates a new {@code AtomicDouble} with the given initial value. 671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param initialValue the initial value 691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public AtomicDouble(double initialValue) { 711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert value = doubleToRawLongBits(initialValue); 721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Creates a new {@code AtomicDouble} with initial value {@code 0.0}. 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public AtomicDouble() { 781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // assert doubleToRawLongBits(0.0) == 0L; 791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Gets the current value. 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return the current value 851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public final double get() { 871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return longBitsToDouble(value); 881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Sets to the given value. 921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param newValue the new value 941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public final void set(double newValue) { 961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert long next = doubleToRawLongBits(newValue); 971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert value = next; 981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Eventually sets to the given value. 1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param newValue the new value 1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public final void lazySet(double newValue) { 1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert set(newValue); 1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // TODO(user): replace with code below when jdk5 support is dropped. 1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // long next = doubleToRawLongBits(newValue); 1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // updater.lazySet(this, next); 1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Atomically sets to the given value and returns the old value. 1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param newValue the new value 1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return the previous value 1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public final double getAndSet(double newValue) { 1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert long next = doubleToRawLongBits(newValue); 1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return longBitsToDouble(updater.getAndSet(this, next)); 1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Atomically sets the value to the given updated value 1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * if the current value is <a href="#bitEquals">bitwise equal</a> 1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * to the expected value. 1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param expect the expected value 1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param update the new value 1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return {@code true} if successful. False return indicates that 1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * the actual value was not bitwise equal to the expected value. 1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public final boolean compareAndSet(double expect, double update) { 1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return updater.compareAndSet(this, 1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert doubleToRawLongBits(expect), 1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert doubleToRawLongBits(update)); 1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Atomically sets the value to the given updated value 1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * if the current value is <a href="#bitEquals">bitwise equal</a> 1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * to the expected value. 1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>May <a 1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * href="http://download.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/package-summary.html#Spurious"> 1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * fail spuriously</a> 1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * and does not provide ordering guarantees, so is only rarely an 1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * appropriate alternative to {@code compareAndSet}. 1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param expect the expected value 1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param update the new value 1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return {@code true} if successful 1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public final boolean weakCompareAndSet(double expect, double update) { 1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return updater.weakCompareAndSet(this, 1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert doubleToRawLongBits(expect), 1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert doubleToRawLongBits(update)); 1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Atomically adds the given value to the current value. 1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param delta the value to add 1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return the previous value 1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public final double getAndAdd(double delta) { 1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert while (true) { 1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert long current = value; 1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert double currentVal = longBitsToDouble(current); 1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert double nextVal = currentVal + delta; 1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert long next = doubleToRawLongBits(nextVal); 1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (updater.compareAndSet(this, current, next)) { 1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return currentVal; 1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Atomically adds the given value to the current value. 1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param delta the value to add 1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return the updated value 1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public final double addAndGet(double delta) { 1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert while (true) { 1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert long current = value; 1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert double currentVal = longBitsToDouble(current); 1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert double nextVal = currentVal + delta; 1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert long next = doubleToRawLongBits(nextVal); 1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (updater.compareAndSet(this, current, next)) { 1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return nextVal; 1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns the String representation of the current value. 1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return the String representation of the current value 1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public String toString() { 2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Double.toString(get()); 2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns the value of this {@code AtomicDouble} as an {@code int} 2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * after a narrowing primitive conversion. 2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public int intValue() { 2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (int) get(); 2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns the value of this {@code AtomicDouble} as a {@code long} 2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * after a narrowing primitive conversion. 2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public long longValue() { 2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (long) get(); 2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns the value of this {@code AtomicDouble} as a {@code float} 2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * after a narrowing primitive conversion. 2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public float floatValue() { 2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (float) get(); 2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns the value of this {@code AtomicDouble} as a {@code double}. 2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public double doubleValue() { 2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return get(); 2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Saves the state to a stream (that is, serializes it). 2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @serialData The current value is emitted (a {@code double}). 2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private void writeObject(java.io.ObjectOutputStream s) 2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throws java.io.IOException { 2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert s.defaultWriteObject(); 2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert s.writeDouble(get()); 2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Reconstitutes the instance from a stream (that is, deserializes it). 2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private void readObject(java.io.ObjectInputStream s) 2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throws java.io.IOException, ClassNotFoundException { 2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert s.defaultReadObject(); 2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert set(s.readDouble()); 2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 257