AtomicInteger处理同步吗?

3
如果两个线程使用 i++ 来同时增加同一个 int i,就会存在问题,因为 i++ 不是原子操作。这就是为什么有 AtomicInteger.increment(),它可以使增加变成原子性的操作。如果我们只有1个核心并且有2个线程在执行 .increment(),那么就绝对不会有问题(因为它不可能在操作中间被挂起)。
但是如果我们有2个核心和2个线程,他们同时(完全相同的时间)调用increment()呢?
他们是否有可能同时加载同一个int i的值?这意味着如果int i 1 ,则最终结果将为 2 而不是 3 。在这种情况下,我们不关心它是否为原子操作,因为他们都同时取得了相同的值。
总之:AtomicInteger处理同步吗?

也许这可以帮助? https://dev59.com/RWQm5IYBdhLWcg3w6CWr - coroutineDispatcher
尤其是这个答案:https://dev59.com/RWQm5IYBdhLWcg3w6CWr#17254001 - GhostCat
谢谢,读完这篇文章后我再也不会使用它了,因为它不是线程安全的。现在我想不出任何情况下我会使用它而不是同步块。 - Ana Maria
我还建议阅读https://dev59.com/6HA75IYBdhLWcg3wAUF9。 - M A
1个回答

3

是否有可能它们加载相同的int i值?

是的,可能会发生这种情况,但这已经被处理好了。

incrementAndGet方法使用了一个原子的“比较并设置”操作,它会将递增后的值设置进去,但仅当一个新值没有被设置时才会这样做。如果比较失败,incrementAndGet会获取新的值并再次尝试。

由此产生的效果是,从多个线程中使用incrementAndGet是安全的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接