我用atomicinteger实现了以下计数器类。我从这篇文章中复制并粘贴了这个类:
public class Counter {
private final AtomicInteger counter = new AtomicInteger(0);
public int get() {
return counter.get();
}
public void increment() {
while (true) {
int existingValue = get();
int newValue = existingValue + 1;
if (counter.compareAndSet(existingValue, newValue)) {
return;
}
}
}
}
我编写了以下测试以确保它确实是线程安全的计数器:
@Test
public void counterWorksAsExpected() {
IntStream.range(0, 100).forEach(j -> {
int threads = 100;
Counter counter = new Counter();
ExecutorService executorService = Executors.newCachedThreadPool();
IntStream.range(0, threads).forEach(i -> {
executorService.execute(counter::increment);
});
executorService.shutdown();
assertEquals(threads, counter.get());
});
}
但是在某些迭代中,assertequals失败了。
我想知道那是我的 Counter
类不是线程安全的?或者我的测试有逻辑错误?
1条答案
按热度按时间ndh0cuux1#
您关闭了executor,但并不等待提交的任务完成,然后才进行Assert。向添加呼叫
awaitTermination()
在检查结果之前。