java - AtomicInteger 和比较操作
问题描述
我正在尝试使用 AtomicInteger 变量作为锁。所以,想知道下面发布的代码是否是线程安全的。我知道 incrementAndGet() 是一个原子操作。但是,我不确定后续的 '==' 操作是否也是原子的(如果值在我进行比较时增加到 2 会怎样。)。所以发布这个问题来听听你的想法。
private AtomicInteger count = new AtomicInteger(0); //Shared variable
private final int max = 1;
if(count.incrementAndGet() == max) {
//Do something
}
解决方案
由于incrementAndGet()
是原子操作,因此最多可以有一个线程获取1
结果(只要 AtomicInteger 的值未设置为低于 1)。这是由 AtomicInteger 保证的。虽然实际比较不是这个原子操作的一部分,但只有接收到的线程1
才会运行到if
块中。这是因为比较比较了 typeint
的两个值:)incrementAndGet()
和max
. AtomicInteger 在其中不起作用,因为int
当内部状态发生变化时,原语不会改变它的值count
。tl; dr:您的代码相当于:
final int val = count.incrementAndGet(); // (it makes no difference if val is not 'final`)
if (val == max) {
// ...
}
Java 提供了许多其他方法来实现线程安全(Lock、CountDownLatch、Semaphore,...),但是由于您指的是 AtomicInteger,我相信AtomicInteger.compareAndSet()更准确地满足您的要求:
if (count.compareAndSet(0, 1)) {
// executed if count == 0
count.set(0);
}
推荐阅读
- python-3.x - 了解梯度下降的类型及其在 Pytorch 框架中的计算方式并使其更具动态性
- scala - 如何在 Spark 中将多个列合并为 MapType?
- ssl - 如何在带有 SSL 的 nginx 反向代理后面正确运行 BeEF
- java - 如何为 JAR 文件 paermanenlty 设置类路径
- python-3.x - shutil.copy 在 os.makedirs 之后失败
- javascript - 反应本机 ArrayIndexOutOfBoundsException
- javascript - 将 Jquery 函数导入 React
- php - 在数据库表上插入表单数据取决于从下拉列表中选择的值
- python - 将 (x,x) 转换为数据框 pandas python
- c++ - 为什么虚函数不能是静态的和全局的?