簡體   English   中英

Java 線程安全計數器無法按預期工作

[英]Java thread safe counter does not work as expected

我有以下用 AtomicInteger 實現的 Counter 類。 我從這篇文章中復制並粘貼了這個類:

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類是否不是線程安全的。

您關閉了執行程序,但在斷言之前不等待提交的任務完成。 在檢查結果之前添加對awaitTermination()的調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM