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