AtomicInteger如何是线程安全的

Gee*_*arn 1 java multithreading atomicinteger

我正在阅读一些有关Java中原子变量的文档。随处可见,AtomicInteger应该是线程安全的。

根据我对原子整数的理解,它基于比较和交换算法的原理。当两个线程试图在同一时间递增同一原子变量时,我无法理解它将如何工作。

说我已经定义了AtomicInteger var = 1,这被两个线程Thread_1Thread_2。什么时候会发生两个线程将尝试递增var的同时T1。我知道这种情况很少见,但是如果发生的话该怎么办。在比较和交换中,它通过单个原子操作读取和更新变量,并从内存中检查值。因此,如果在什么时间T1-1,VAR的值为5,并都Thread1Thread2将开始增加呢?哪一个会失败?会是随机行为吗?或我缺少一些非常基本的东西。

And*_*ner 5

比较和交换在CPU级别是原子的。

您可以使用compare和swap显式实现增量操作:

int value = var.get();
while (!var.compareAndSwap(value, value + 1)) { 
  value = var.get();
}
Run Code Online (Sandbox Code Playgroud)

compareAndSwap由CPU保证是原子(会有一个本机实现这一点)。

如果两个线程同时命中该线程compareAndSwap,则只有其中一个线程将“获胜”,并true作为compareAndSwap调用结果接收,因此循环停止。

另一个线程将“丢失”并接收false结果,因此将再次绕过循环:它读取一个新值,然后再次尝试CAS。如果成功(因为没有其他线程同时尝试执行此操作,或者因为它“胜过”另一个线程),则循环停止;否则,它将再次尝试。