AtomicInteger 是否处理同步?
Does AtomicInteger handle synchronization?
如果两个线程都使用 i++ 增加相同的 int i
,我们可能会遇到问题,因为 i++ 不是原子的手术。这就是为什么有 AtomicInteger.increment()
,这使得递增成为原子的。所以如果我们有 1 个核心和 2 个线程做 .increment()
,那绝对没有问题(因为它不能在操作中暂停)。
但是如果我们有 2 个内核和 2 个线程并且它们并行地(完全同时)调用 increment()
会怎样?
他们是否有可能加载相同的 int i
值?这意味着如果 int i
是 1,最终结果将是 2 而不是 3。在那种情况下,我们不关心它是否是原子操作,因为它们同时取相同的值..
底线:同步是由 AtomicInteger 处理的吗?
Could there be possibility that they load same value of int i
?
是的,有,但已经为您处理了。
incrementAndGet
方法使用原子“比较和设置”操作来设置增量值 ,但前提是尚未设置新值。如果比较失败,incrementAndGet
获取新值并重试。
最终效果是,从多个线程使用 incrementAndGet
是安全的。
如果两个线程都使用 i++ 增加相同的 int i
,我们可能会遇到问题,因为 i++ 不是原子的手术。这就是为什么有 AtomicInteger.increment()
,这使得递增成为原子的。所以如果我们有 1 个核心和 2 个线程做 .increment()
,那绝对没有问题(因为它不能在操作中暂停)。
但是如果我们有 2 个内核和 2 个线程并且它们并行地(完全同时)调用 increment()
会怎样?
他们是否有可能加载相同的 int i
值?这意味着如果 int i
是 1,最终结果将是 2 而不是 3。在那种情况下,我们不关心它是否是原子操作,因为它们同时取相同的值..
底线:同步是由 AtomicInteger 处理的吗?
Could there be possibility that they load same value of
int i
?
是的,有,但已经为您处理了。
incrementAndGet
方法使用原子“比较和设置”操作来设置增量值 ,但前提是尚未设置新值。如果比较失败,incrementAndGet
获取新值并重试。
最终效果是,从多个线程使用 incrementAndGet
是安全的。