...
The JMM guarantees that the fully initialized values of fields that are declared final are safely published to every thread that reads those values at some point no later earlier than the end of the object's constructor.
...
However, this solution requires the assignment of a new Helper
instance to helper
from Foo's constructor. According to The Java Language Specification, §17.5.2, "Reading Final Fields During Construction" [JLS 2015]:
A read of a final field of an object within the thread that constructs that object is ordered with respect to the initialization of that field within the constructor by the usual happens-before rules. If the read occurs after the field is set in the constructor, it sees the value the final field is assigned; otherwise, it sees the default value.
...
Because the Helper
class is declared public, it uses a private lock to handle synchronization in conformance with LCK00-J. Use private final lock objects to synchronize classes that may interact with untrusted code.
Exceptions
TSM03-J-EX0: Classes that prevent partially initialized objects from being used may publish partially initialized objects. This could be implemented, for example, by setting a volatile Boolean flag in the last statement of the initializing code and checking whether the flag is set before allowing class methods to execute.
...
Failure to synchronize access to shared mutable data can cause different threads to observe different states of the object or to observe a partially initialized object.
Rule | Severity | Likelihood | Remediation Cost | Priority | Level |
---|---|---|---|---|---|
TSM03-J | Medium | Probable | Medium | P8 | L2 |
Automated Detection
Tool | Version | Checker | Description |
---|
Bibliography
[API 2006] |
Item 48, "Synchronize Access to Shared Mutable Data" | |
Section 3.5.3, "Safe Publication Idioms" | |
Pattern #2, "One-Time Safe Publication" | |
[JPL 2006] | Section 14.10.2, "Final Fields and Security" |
...
...