最近我正在阅读一个教程,因为我发现了一个声明说...
"Java语言规范保证读取或写入变量是一个原子操作(除非变量是类型long
或者double
).类型的操作变量long
或double
只有在用volatile
关键字声明时才是原子的."
AtomicInteger
或AtomicLong
提供类似的方法getAndDecrement()
,getAndIncrement()
以及getAndSet()
哪些是原子方法.
我对上述陈述感到困惑.你能澄清何时使用 AtomicInteger
或AtomicLong
上课.
否则a = 28
(与a
作为一个int
)是一个原子操作.但这样做a++
不是原子操作,因为它需要读取a的值,增量和写入结果.因此,如果您曾经a++
实现过一个线程安全计数器,那么您可以有两个线程同时读取该值(例如26),然后同时增加它并同时写入它,结果导致27,而不是28 .
AtomicInteger通过提供与您列出的原子操作类似的原子操作来解决此问题.在我的示例中,您将使用incrementAndGet()
例如,这将保证结束值为28而不是27.
原子意味着操作完成,没有任何可能发生的事情.例如.AtomicInteger上的getAndDecrement()保证变量同时返回和递减.
如果它不是原子操作,则可能存在值递减(例如从3到2),然后由另一个线程修改(例如,将其从2更改为5),然后返回为5.