All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.intellifylearning.stats.AtomicDouble Maven / Gradle / Ivy

package com.intellifylearning.stats;

import static java.lang.Double.doubleToLongBits;

import java.util.concurrent.atomic.AtomicLong;

/**
 * A thread-safe and lock-free double implementation
 * based on this stack overflow answer:
 * http://stackoverflow.com/questions/5505460/java-is-there-no-atomicfloat-or-atomicdouble
 *
 */
class AtomicDouble extends Number {

    private static final long serialVersionUID = -2480549991498013056L;
    private AtomicLong bits;

    AtomicDouble() {
        this(0);
    }

    AtomicDouble(double initialValue) {
        bits = new AtomicLong(doubleToLongBits(initialValue));
    }

    public final boolean compareAndSet(double expect, double update) {
        return bits.compareAndSet(doubleToLongBits(expect),
                doubleToLongBits(update));
    }

    public final void set(double newValue) {
        bits.set(doubleToLongBits(newValue));
    }

    public final double get() {
        return Double.longBitsToDouble(bits.get());
    }

    @Override
    public float floatValue() {
        return (float) get();
    }

    public final double addAndGet(double newValue) {
        return Double.longBitsToDouble(bits.addAndGet(doubleToLongBits(newValue)));
    }

    public final double getAndSet(double newValue) {
        return Double.longBitsToDouble(bits.getAndSet(doubleToLongBits(newValue)));
    }

    public final boolean weakCompareAndSet(float expect, float update) {
        return bits.weakCompareAndSet(doubleToLongBits(expect),
                doubleToLongBits(update));
    }

    @Override
    public double doubleValue() {
        return floatValue();
    }

    @Override
    public int intValue() {
        return (int) get();
    }

    @Override
    public long longValue() {
        return (long) get();
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy