使用AtomicInteger和JMH多线程?

时间:2016-09-26 12:45:46

标签: multithreading scala jmh atomicinteger

我正在使用JMH来测试我项目的一些功能。当我尝试使用带有AtomicInteger的@GroupThreads时,我无法重置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
  }

}

1 个答案:

答案 0 :(得分:1)

有一种固有的种族。您可能永远不会在10中观察到CAS(10, -1) - 当多个线程在10之上运行增量时 - 因此错过了重置操作。如果你想要正确同步计数器模N,我建议详细说明这个未经测试的草图:

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);
}