AtomicInteger中的“比较并设置”如何工作

AtomicInteger使用两个概念:CAS和volatile变量。

使用volatile变量可确保当前值对所有线程可见,并且不会被缓存。

但是我对以下解释的CAS(compare AND set)概念感到困惑:

public final int getAndIncrement() {

for (;;) {

int current = get();

int next = current + 1;

if (compareAndSet(current, next))

return current;

}

}

我的问题是什么if(compareAndSet(current,

next)回报false?值不会更新吗?在这种情况下,当线程执行以下情况时会发生什么:

private AtomicInteger count = new AtomicInteger();

count.incrementAndGet();

回答:

原子对象利用Compare和Swap机制使它们成为原子-

即可以保证该值 指定的 是新值。

您发布的代码不断尝试将当前值设置为比以前大一的值。请记住,另一个线程也可能执行了get并且正在尝试设置它。如果两个线程相互竞争以更改值,则增量之一可能会失败。

请考虑以下情形:

  1. 线程1调用get并获取值1
  2. 线程1计算next2
  3. 线程2调用get并获取值1
  4. 线程2计算next2
  5. 两个线程都尝试写入值。

现在,因为原子能的- ,对方将收到false来自compareAndSet和再绕过去。

如果不使用此机制,则两个线程都很有可能增加该值,从而导致实际上仅执行一次增量。

for(;;)只有在许多线程同时写入变量的情况下,令人困惑的无限循环才会真正循环。在非常重的负载下,它可能会循环几次,但是应该很快完成。

以上是 AtomicInteger中的“比较并设置”如何工作 的全部内容, 来源链接: utcz.com/qa/423522.html

回到顶部