AtomicInteger 条件检查线程安全

AtomicInteger conditional check thread safe

我运行怀疑下面是否是线程安全的,

// is this thread safe, final int MAX_COUNT = 3 ?
if (retryCount.get() < MAX_COUNT) {
    // some other code
    retryCount.getAndIncrement();
} else {
    // reset count & some other code
    retryCount.set(0);
}

以上条件检查线程安全吗?

不,它不是线程安全的,因为代码正在执行所谓的 check-then-act 操作。

AtomicInteger 本身是线程安全的,这意味着它的各个方法是原子的,但执行复合操作不是原子的。所以上面的代码需要同步

这里有一些来自 Java Concurrency In Practice

的重要笔记

不,不是。

假设两个线程 T1T2retryCount 实际上包含 2 值。
假设 T1 执行 if(retryCount.get() < MAX_COUNT){(评估为真)但没有达到 retryCount.getAndIncrement();.
T1 已暂停。 T2 已恢复。
T2 执行 if(retryCount.get() < MAX_COUNT){ 仍然评估为真。

因此您确定 retryCount 的价值将等于 4

您需要显式同步,在这种情况下,AtomicInteger 可能 不需要:

synchronized(lock){
  if(retryCount.get() < MAX_COUNT){
  // some other code
  retryCount.getAndIncrement();
  }else{
   // reset count & some other code
   retryCount.set(0);
  } 
}