原子整数条件检查线程安全



我遇到了一个疑问,如果下面是否线程安全,

// 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);
}

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

不,

它没有。

假设两个线程T1T2retryCount实际上包含2值。
假设T1执行if(retryCount.get() < MAX_COUNT){(评估为 true(,但没有达到 retryCount.getAndIncrement();
T1暂停。 恢复T2
T2执行仍计算为 true 的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);
  } 
}

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

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

以下是 Java 并发实践中的一些重要说明

最新更新