44 lines
1.3 KiB
Plaintext
44 lines
1.3 KiB
Plaintext
Marking an array ``++volatile++`` means that the array itself will always be read fresh and never thread cached, but the items _in_ the array will not be. Similarly, marking a mutable object field ``++volatile++`` means the object _reference_ is ``++volatile++`` but the object itself is not, and other threads may not see updates to the object state.
|
|
|
|
|
|
This can be salvaged with arrays by using the relevant AtomicArray class, such as ``++AtomicIntegerArray++``, instead. For mutable objects, the ``++volatile++`` should be removed, and some other method should be used to ensure thread-safety, such as synchronization, or ThreadLocal storage.
|
|
|
|
|
|
== Noncompliant Code Example
|
|
|
|
----
|
|
private volatile int [] vInts; // Noncompliant
|
|
private volatile MyObj myObj; // Noncompliant
|
|
----
|
|
|
|
|
|
== Compliant Solution
|
|
|
|
----
|
|
private AtomicIntegerArray vInts;
|
|
private MyObj myObj;
|
|
----
|
|
|
|
|
|
== See
|
|
|
|
* https://wiki.sei.cmu.edu/confluence/x/UzdGBQ[CERT, CON50-J.] - Do not assume that declaring a reference volatile guarantees safe publication of the members of the referenced object
|
|
|
|
|
|
ifdef::env-github,rspecator-view[]
|
|
|
|
'''
|
|
== Implementation Specification
|
|
(visible only on this page)
|
|
|
|
include::message.adoc[]
|
|
|
|
include::highlighting.adoc[]
|
|
|
|
'''
|
|
== Comments And Links
|
|
(visible only on this page)
|
|
|
|
include::comments-and-links.adoc[]
|
|
endif::env-github,rspecator-view[]
|