AtomicFloat y AtomicDouble en Java


En el paquete java.util.concurrent.atomic podemos encontrar las clases AtomicInteger y AtomicLong. Según la propia documentación, estas clases son proporcionadas por ser comunmente utiles en la aplicaciones. En los casos infrecuentes en los que se quieran usar otros tipos de datos atómicamente, se pueden usar las clases AtomicInteger y AtomicFloat para contener los datos y hacer casting apropiadamente. Se puede usar AtomicInteger para contener valores byte y float, usando Float.floatToIntBits y Float.intBitsToFloat. Se puede usar AtomicLong para contener valores double usando Double.doubleToLongBits y Double.longBitsToDouble.
La idea es encapsular un AtomicInteger o AtomicFloat proporcionando los métodos de acceso para getFloat/setFloat, getDouble/setDouble, etc.
A continuación una implementación de AtomicFloat encapsulando un AtomicInteger:


import java.util.concurrent.atomic.AtomicInteger;
import static java.lang.Float.*;

class AtomicFloat extends Number {

    private AtomicInteger bits;

    public AtomicFloat() {
        this(0f);
    }

    public AtomicFloat(float initialValue) {
        bits = new AtomicInteger(floatToIntBits(initialValue));
    }

    public final boolean compareAndSet(float expect, float update) {
        return bits.compareAndSet(floatToIntBits(expect),
                                  floatToIntBits(update));
    }

    public final void set(float newValue) {
        bits.set(floatToIntBits(newValue));
    }

    public final float get() {
        return intBitsToFloat(bits.get());
    }

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

    public final float getAndSet(float newValue) {
        return intBitsToFloat(bits.getAndSet(floatToIntBits(newValue)));
    }

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

    public double doubleValue() {
        return (double) floatValue();
    }
    public int intValue()       {
        return (int) get();
    }
    public long longValue()     {
        return (long) get();
    }

}

No hay comentarios:

Publicar un comentario