我用AtomicInteger实现了以下计数器类。我从this文章中复制并粘贴了这个类:
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类是否是线程安全的。
发布于 2020-11-20 01:43:25
您关闭了executor,但并不是在断言之前等待提交的任务完成。在检查结果之前添加对awaitTermination()的调用。
https://stackoverflow.com/questions/64917001
复制相似问题