AtomicInteger 条件检查线程安全
AtomicInteger conditional check thread safe
我运行怀疑下面是否是线程安全的,
// 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);
}
以上条件检查线程安全吗?
不,它不是线程安全的,因为代码正在执行所谓的 check-then-act
操作。
AtomicInteger
本身是线程安全的,这意味着它的各个方法是原子的,但执行复合操作不是原子的。所以上面的代码需要同步
这里有一些来自 Java Concurrency In Practice
的重要笔记
不,不是。
假设两个线程 T1
和 T2
和 retryCount
实际上包含 2
值。
假设 T1
执行 if(retryCount.get() < MAX_COUNT){
(评估为真)但没有达到 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);
}
}
我运行怀疑下面是否是线程安全的,
// 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);
}
以上条件检查线程安全吗?
不,它不是线程安全的,因为代码正在执行所谓的 check-then-act
操作。
AtomicInteger
本身是线程安全的,这意味着它的各个方法是原子的,但执行复合操作不是原子的。所以上面的代码需要同步
这里有一些来自 Java Concurrency In Practice
的重要笔记不,不是。
假设两个线程 T1
和 T2
和 retryCount
实际上包含 2
值。
假设 T1
执行 if(retryCount.get() < MAX_COUNT){
(评估为真)但没有达到 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);
}
}