AtomicInteger条件检查线程安全

时间:2018-01-17 20:23:33

标签: java multithreading atomicinteger

如果以下是线程安全的话,我遇到了疑问,

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

上述条件检查线程是否安全?

2 个答案:

答案 0 :(得分:4)

不,不是。

假设两个线程T1T2以及retryCount实际包含2值。
假设T1执行if(retryCount.get() < MAX_COUNT){(评估为true)但未达到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);
  } 
}

答案 1 :(得分:1)

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

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

来自 Java Concurrency In Practice

的一些精彩笔记