我遇到了一个疑问,下面的内容是否是线程安全的,
// 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);
}
}
关于java - AtomicInteger条件检查线程安全,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48309401/