I have a need for a counter of type long
with the following requirements/facts:
Based upon these requirements, how would you choose to implement your counter? As a simple long
, as a volatile long
or using an AtomicLong
? Why?
At the moment I have a volatile long
but was wondering whether another approach would be better. I am also incrementing my long by doing ++counter
as opposed to counter++
. Is this really any more efficient (as I have been led to believe elsewhere) because there is no assignment being done?
Given these sets of requirements, I think that a volatile
long should be sufficient. The counter wouldn't be incorrect with a non-volatile
long, but the reader might be reading stale information in that case.
One problem is that reads and writes to a long
are not required to be atomic, by the JVM specification if it is not declared volatile
. That would mean that the reading thread could get a pretty much fictive value if it reads the value while the writing thread has updated one part of the value, but not the other one.
The difference between ++counter
and counter++
is probably irrelevant, as the JVM will realize that the value of the expression is not used any more and the two are equivalent in this case.