Primitives can be read and written to atomically. Except for ``++long++`` and ``++double++``, that is. These 64-bit primitives must be marked ``++volatile++`` in multi-threaded environments, or swapped out for their atomic counterparts: ``++AtomicLong++``, and ``++AtomicDouble++`` to guarantee that their updates are always visible to other threads.


Similarly, to ensure that updates to 32-bit primitives are visible to all threads, they should also be marked ``++volatile++``.


== Noncompliant Code Example

[source,java]
----
long m = 0;  // Noncompliant

public void increment() {
  m++;
}
----


== Compliant Solution

[source,java]
----
volatile long m = 0;

public void increment() {
  m++;
}
----
or

[source,java]
----
AtomicLong m = new AtomicLong(0);

public void increment() {
  m.incrementAndGet();
}
----


== See

* https://wiki.sei.cmu.edu/confluence/x/QTdGBQ[CERT, VNA00-J.] - Ensure visibility when accessing shared primitive variables
* https://wiki.sei.cmu.edu/confluence/x/zzdGBQ[CERT, VNA05-J.] - Ensure atomicity when reading and writing 64-bit values


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[]
