java线程安全计数器不能按预期工作

3xiyfsfu  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(365)

我用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 类不是线程安全的?或者我的测试有逻辑错误?

ndh0cuux

ndh0cuux1#

您关闭了executor,但并不等待提交的任务完成,然后才进行Assert。向添加呼叫 awaitTermination() 在检查结果之前。

相关问题