RFR 8158039 VarHandle float/double field/array access should support CAS/set/add atomics
David Holmes
david.holmes at oracle.com
Fri Aug 4 01:58:54 UTC 2017
Please ignore :)
I was "catching up" with year old email. :D
Same sentiment applies though.
David
On 4/08/2017 11:57 AM, David Holmes wrote:
> Catching up after very long vacation.
>
> For the record I still think this is misguided. The only atomic op you
> can do with float/double is a CAS (and that doesn't operate at the
> semantic level only raw bits). Everything else has to be emulated by
> CAS-loop as no hardware support for atomic FP ops exists.
>
> We made a deliberate choice not to support float/double in j.u.c.atomic
> back with JSR-166 and _nothing_ has changed since then.
>
> Regards,
> David
> -----
>
> Paul Sandoz paul.sandoz at oracle.com
> Tue Jun 14 00:12:14 UTC 2016
>> Hi,
>>
>> Here is an updated webrev.
>>
>> http://cr.openjdk.java.net/~psandoz/jdk9/JDK-8158039-float-double-field-array-cas.jdk/webrev/
>>
>> http://cr.openjdk.java.net/~psandoz/jdk9/JDK-8158039-float-double-field-array-cas.hotspot/webrev/
>>
>>
>> Changes
>>
>> - the Unsafe.getAndAdd for float/double operate in the bit-domain.
>>
>> - documentation added to the factory methods:
>>
>> 1221 * <p>
>> 1222 * If the field type is {@code float} or {@code double}
>> then numeric
>> 1223 * and atomic update access modes compare values using
>> their bitwise
>> 1224 * representation (see {@link Float#floatToRawIntBits} and
>> 1225 * {@link Double#doubleToRawLongBits}, respectively).
>> 1226 * <p>
>> 1227 * @apiNote
>> 1228 * Bitwise comparison of {@code float} values or {@code
>> double} values,
>> 1229 * as performed by the numeric and atomic update access
>> modes, differ
>> 1230 * from the primitive {@code ==} operator and the {@link
>> Float#equals}
>> 1231 * and {@link Double#equals} methods, notably with
>> respect to
>> 1232 * {@code NaN}. There are many possible NaN values that
>> are considered
>> 1233 * to be {@code NaN} in Java, although no IEEE 754
>> floating-point
>> 1234 * operation provided by Java can distinguish between
>> them. As such
>> 1235 * care should be taken when performing a compare and set
>> or a compare
>> 1236 * and exchange operation with NaN values since the
>> operation may
>> 1237 * unexpectedly fail. Failure can occur if the expected
>> or witness
>> 1238 * value is a NaN value and it is transformed (perhaps in
>> a platform
>> 1239 * specific manner) into another NaN value, and thus has
>> a different
>> 1240 * bitwise representation (see {@link
>> Float#intBitsToFloat} or
>> 1241 * Double#longBitsToDouble for more details).
>>
>> (I also updated the documentation on array/ByteBuffer view methods but
>> did not bother with the api note)
>>
>> Paul.
>
More information about the jdk9-dev
mailing list