Потокобезопасный счетчик - Atomi c Integer не работает - PullRequest
0 голосов
/ 12 марта 2020

У меня есть (скажем) 10 потоков. Все потоки увеличивают счетчик и тоже будут регистрироваться. Счетчик представляет собой целое число в атомах c, но иногда я получаю повторяющиеся значения в счетчике. То, что я ожидаю, - это то, что counter является поточно-ориентированным, позволяет увеличивать счетчик только одним потоком за раз, читать только одним потоком за раз. Что я должен делать по-другому ?! Спасибо

Class A{
 public void AM(){
   ExecutorService executor = Executors.newFixedThreadPool(threadPoolCount);
   List tasks = new ArrayList(tasklist);
   for(loop tasks) {
   Future<t> futureObjects = executor.invokeAll(task);
  }
 }
}
Class B implements Callable{
    public Object call(){
      //call method log
  }
}
Class C {
  static AtomicInteger counter = new AtomicInteger(1);
  public void log(){
    log("counter: "+counter)
    counter.getAndIncrement();
  }
}

1 Ответ

3 голосов
/ 12 марта 2020

С приведенным ниже кодом, вы не увидите дубликаты значений в вашем журнале. Вы пытаетесь выполнить печать перед обновлением, что может привести к многопоточности печати одного и того же значения:

Class C {
  static AtomicInteger counter = new AtomicInteger(1);
  public void log(){
    int count = counter.getAndIncrement();
    log("counter: "+count)
  }
}
...