我遇到了一个疑问,如果下面是否线程安全,
// 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);
}
上述条件检查线程安全吗?
它没有。
假设两个线程T1
和T2
,retryCount
实际上包含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 并发实践中的一些重要说明