[External] : Re: We have to talk about "primitive".
Brian Goetz
brian.goetz at oracle.com
Wed Dec 15 23:06:12 UTC 2021
It took us a while to unravel this one, but I think we did.
The JMM says that loads and stores of references, and of
32-bit-and-smaller primitive values, are atomic with respect to other
loads and stores of the same variable. This means that you'll see a
valid value, though it could be a stale one. For 64 bit primitives, it
is treated as 2 32 bit loads, which are individually atomic.
The initialization safety guarantees -- that you see correct values of
final fields even when loading a reference with a race -- rests on the
atomicity properties above.
What this says is that tearing/non-tearing is a property of
reference-vs-primitive-ness; accessing a (fat) value through a reference
gives you *more guarantees* than accessing it directly.
(Correspondingly, this has more costs.)
All of this is to say, as I think you are saying: primitives of a
certain size were always tearable, and they still are; references never
were, and they are still not.
> As for tearability: from /this/ perspective 64-bit values are already
> technically tearable, so nothing new here. It's from a different
> perspective, that of writing a class, where expectations have to be
> weakened.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/valhalla-spec-experts/attachments/20211215/2b2e4b66/attachment.htm>
More information about the valhalla-spec-experts
mailing list