2

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

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

上面的条件检查线程安全吗?

4

2 回答 2

4

不,它没有。

假设两个线程T1和实际包含的T2值。 假设执行(评估为真)但未达到. 暂停。恢复。执行仍被评估为真。retryCount2
T1if(retryCount.get() < MAX_COUNT){retryCount.getAndIncrement();
T1T2
T2if(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);
  } 
}
于 2018-01-17T20:31:26.920 回答
1

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

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

这是Java Concurrency In Practice中的一些精彩笔记

于 2018-01-17T20:31:00.450 回答