[jmm-dev] The JSR-133 Cookbook and final fields

Andrew Haley aph at redhat.com
Tue Nov 15 11:43:27 UTC 2016


http://g.oswego.edu/dl/jmm/cookbook.html says:

... the special final-field rule requiring a StoreStore barrier in
      x.finalField = v; StoreStore; sharedRef = x;

but http://www.hboehm.info/c++mm/no_write_fences.html says:

... it is also generally unsafe to restrict the release ordering
   constraint in thread 1 to only stores. To see this, consider what
   happens if the initialization of x also reads x

I am convinced by Hans Boehm's argument in the second reference, and I
believe that only to use a StoreStore fence is too fragile unless you
disallow some optimizations.

Thread 1:

class X {
      int x;

      X() {
          a = 0;
          a++;
      }
}

void publish() {
    X x = new X();
}

Thread 2:

    x.a = 42;

This is safe enough at the Java level, but inlining of constructors at
the machine level mean that it's hard to guarantee without a LoadStore
at the end of the constructor.  On AArch64 at least we have address
dependency ordering from a load to a memory op based on it, which is
adequate in this case, I think.

I'd prefer to simply have an adjudication that we need a release
barrier at the end of a constructor, but mostly I'd like some sort of
decision.

Thanks,

Andrew.


More information about the jmm-dev mailing list