【发布时间】:2020-11-19 17:34:24
【问题描述】:
我使用 AtomicInteger 实现了以下 Counter 类。我从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 类是否不是线程安全的。
【问题讨论】:
-
断言失败的消息是什么?
-
当
AtomicInteger带有getAndIncrement()/incrementAndGet()方法来为您完成工作时,您为什么要这样做increment()逻辑? -
我写了我使用baeldung.com/java-atomic-variables文章中的示例。
标签: java concurrency atomic