1

プロジェクトのいくつかの機能をテストするために JMH を使用しています。@GroupThreads を AtomicInteger で使用しようとすると、AtomicInteger をリセットできず、時間の経過とともに増加します。また、 if else を使用して AtomicInteger をチェックおよびリセットしようとしましたが、できません。私の問題に対する提案を教えてください。どうもありがとうございます。

class JMHSample_15_Asymmetric {

  private var counter: AtomicInteger = _

  @Setup
  def up() {
    counter = new AtomicInteger
  }

  @Benchmark
  @Group("g")
  @GroupThreads(3)
  def inc: Int = {
    counter.compareAndSet(10,-1)
    counter.incrementAndGet
  }
  @Benchmark
  @Group("g")
  @GroupThreads(1)
  def get: Int = {
    println("Counter --> "+ counter.get)
    counter.get
  }

}
4

1 に答える 1

1

固有の人種があります。複数のスレッドがインクリメントを実行するときに、決して観察10しない可能性があるため、リセットアクションを見逃す可能性があります。N を法とするカウンタを適切に同期させたい場合は、この未テストのスケッチを詳しく説明することをお勧めします。CAS(10, -1)10

int countUp() {
  int cur, next;
  do {
    cur = counter.get();
    next = cur < N ? (cur + 1) : 0;
  } while (!counter.compareAndSet(cur, next));
  return next;
}

...または、Java 8 では:

int countUp() {
  return counter.updateAndGet(v -> (v < N) ? (v + 1) : 0);
}
于 2016-09-27T10:13:38.733 に答える