【发布时间】:2019-10-06 13:14:15
【问题描述】:
我正在阅读一些关于 Java 中的原子变量的文档。 随处可见,AtomicInteger 应该是线程安全的。
根据我对原子整数的理解,它的工作原理是比较和交换算法。 当两个线程尝试在完全相同的时间递增相同的原子变量时,我无法理解这将如何工作。
假设我定义了AtomicInteger var = 1,它被两个线程Thread_1 和Thread_2 使用。当两个线程都尝试同时增加var T1 时会发生什么。
我知道这将是罕见的情况,但如果它发生了怎么办。在比较和交换中,它在单个原子操作中读取和更新变量,并检查内存中的值。那么如果在T1-1 时,var 的值为 5 并且Thread1 和Thread2 都将开始递增呢?
哪一个会失败?会是随机行为吗?或者我错过了一些非常基本的东西。
【问题讨论】:
-
“我知道这将是罕见的” 稀有完全取决于具体情况。与
AtomicLong相比,Java 8 中提供了LongAdder提供了一种在多个线程中增加 long 的竞争较少的方法,这一点很常见。
标签: java multithreading atomicinteger