Re: Guarantees around Servlet Filter initialization that sets an instance variable?

"Ludwig, Mark via Concurrency-interest" <[email protected]> Tue, 28 Apr 2020 15:32:27 +0000
Newsgroups gmane.comp.java.jsr.166-concurrency
Message-ID <BC5672F8AD4C054BAF167C9801500D1A0179039496@USSLMMBX004.net.plm.eds.com>
Thank you.  I have a follow-up question....

> From: Kasper Nielsen <[email protected]>, Tuesday, April 28, 2020 9:21 AM
> 
> The code you posted it basically good old double-checked-locking [1] in
> disguise. There is no happens-before relationship between
> SynchronizedDataAccessor.setAll and subsequent calls to
> UnsynchronizedDataAccessor.getConfig. So you have accomplished nothing.
> Other
> than confusing your co-workers.

I think you're saying I misunderstand this language (from
https://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.5):

------------------------------------------------------------
final fields also allow programmers to implement thread-safe
immutable objects without synchronization. A thread-safe
immutable object is seen as immutable by all threads, even
if a data race is used to pass references to the immutable
object between threads. This can provide safety guarantees
against misuse of an immutable class by incorrect or
malicious code. final fields must be used correctly to
provide a guarantee of immutability.

An object is considered to be completely initialized when
its constructor finishes. A thread that can only see a
reference to an object after that object has been completely
initialized is guaranteed to see the correctly initialized
values for that object's final fields.

The usage model for final fields is a simple one: Set the
final fields for an object in that object's constructor; and
do not write a reference to the object being constructed in
a place where another thread can see it before the object's
constructor is finished. If this is followed, then when the
object is seen by another thread, that thread will always
see the correctly constructed version of that object's final
fields. It will also see versions of any object or array
referenced by those final fields that are at least as
up-to-date as the final fields are.
------------------------------------------------------------

At the end of the reference you sent, the following 
seems to support what I'm trying to do:
------------------------------------------------------------
Double-Checked Locking Immutable Objects

If Helper is an immutable object, such that all of the
fields of Helper are final, then double-checked locking will
work without having to use volatile fields. The idea is that
a reference to an immutable object (such as a String or an
Integer) should behave in much the same way as an int or
float; reading and writing references to immutable objects
are atomic.
------------------------------------------------------------

Is the following statement not effectively atomic -- can the
'data' reference point to the not-completely-initialized
UnsynchronizedDataAccessor object?

         data = new UnsynchronizedDataAccessor(config);

I thought the effectively-atomic behavior derives from an
update of a reference always being atomic; the rest from
construction of an object with only final fields being
effectively atomic, which I thought was guaranteed by the
statements in the JLS I referenced above, because the
constructed UnsynchronizedDataAccessor object only has final
fields.

I appreciate being educated/disabused....

Thanks!
Mark
_______________________________________________
Concurrency-interest mailing list
[email protected]
http://cs.oswego.edu/mailman/listinfo/concurrency-interest