首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java线程安全计数器未按预期工作

Java线程安全计数器未按预期工作
EN

Stack Overflow用户
提问于 2020-11-20 01:34:24
回答 1查看 44关注 0票数 0

我用AtomicInteger实现了以下计数器类。我从this文章中复制并粘贴了这个类:

代码语言:javascript
运行
复制
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;
          }
      }
  }
}

我写了下面的测试,以确保它确实是一个线程安全计数器:

代码语言:javascript
运行
复制
@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类是否是线程安全的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-20 01:43:25

您关闭了executor,但并不是在断言之前等待提交的任务完成。在检查结果之前添加对awaitTermination()的调用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64917001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档