我在阅读有关Java中原子变量的文档。通常情况下,AtomicInteger被认为是线程安全的。
根据我的理解,原子整数的工作原理是基于比较与交换算法。但我不理解,如果两个线程同时尝试增加同一个原子变量会怎么样。
例如,我定义了AtomicInteger var = 1
,并且这被线程Thread_1
和Thread_2
使用。当这两个线程尝试在同一时间T1
对var
进行递增时,会发生什么?
我知道这将是很少见的情况,但如果真的发生了呢?在比较和交换中,它会在单个原子操作中读取和更新变量,并从内存中检查值。那么如果在时间T1-1
时,var的值为5,并且Thread1
和Thread2
都开始递增它,会发生什么?哪一个会失败?这将是随机行为吗?或者我漏掉了一些非常基本的东西。
LongAdder
,以提供一种比AtomicLong
更少竞争的方式来在多个线程中递增长整型。 - Andy Turner