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

Hans Boehm boehm at acm.org
Tue Nov 15 18:44:01 UTC 2016

I think this is actually OK for final fields, since no other thread can
write them, and hence reads in the constructor can't really see a write by
another thread.

I continue to believe that we should not generalize the final field
behavior to non-final fields, at least not without generalizing the
constructor barrier to also include LoadStore. Which I think means we're
kind of in agreement. If we did so, and programmers took advantage of that,
it would also mean that constructor() { non_final_field = 0; assert
non_final_field == 0; } could reasonably fail, which seems bad.

Generalizing final field memory ordering to non-final fields also has
optimization consequences on the reader side that we're still struggling
with for C++.

For example, on any flavor of ARM or Power, in

tmp = x;
tmp2 = y;
if (tmp == tmp2) {
    tmp3 = tmp2.a;

the last assignment can no longer be replaced by tmp3 = tmp.a, because that
wouldn't preserve ordering between the load of y and that of a. (I suspect
that such a replacement can be beneficial if the branch can be correctly
predicted, since tmp may be available earlier.)

Presumably similar rules already apply to final field optimization.  I have
no idea whether existing Java compilers actually make such distinctions.

On Tue, Nov 15, 2016 at 5:53 AM, Andrew Haley <aph at redhat.com> wrote:

> It's been pointed out to me that my example doesn't have a final
> field!  It would perhaps have been better not to provide an example,
> so rather than muddy the water any further I'll let the question
> stand.
> Andrew.

More information about the jmm-dev mailing list