我遇到了一个疑问,下面的内容是否是线程安全的,

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

关于java - AtomicInteger条件检查线程安全,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48309401/

10-10 15:17