如果以下是线程安全的话,我遇到了疑问,
// 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);
}
上述条件检查线程是否安全?
答案 0 :(得分:4)
不,不是。
假设两个线程T1
和T2
以及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
本身就是线程安全的,这意味着它的各个方法都是原子的,但执行复合操作不是原子的。所以上面的代码需要同步