私は最近CodaHale/DropWizardメトリクスライブラリを学び始めました。私があることがわかりますcodahale metricsのメーターマーク()メソッドはどのようにスレッドセーフですか?
public void mark(long n) {
tickIfNecessary();
count.add(n);
m1Rate.update(n);
m5Rate.update(n);
m15Rate.update(n);
}
private void tickIfNecessary() {
final long oldTick = lastTick.get();
final long newTick = clock.getTick();
final long age = newTick - oldTick;
if (age > TICK_INTERVAL) {
final long newIntervalStartTick = newTick - age % TICK_INTERVAL;
if (lastTick.compareAndSet(oldTick, newIntervalStartTick)) {
final long requiredTicks = age/TICK_INTERVAL;
for (long i = 0; i < requiredTicks; i++) {
m1Rate.tick();
m5Rate.tick();
m15Rate.tick();
}
}
}
}
:私はメータークラスのスレッドセーフ(それはマニュアルに従っている)、特にマーク(あるかを理解)、ここでtickIfNecessary()メソッドはできませんlastTick型のAtomicLongがありますが、m1-m15のレートがちょっと遅くなっているので、別のスレッドが次のTICK_INTERVALの一部と同様にそれらのティックを呼び出すことができます。 tickのtick()メソッドは全く同期していないので、それは競合状態にならないでしょうか? https://github.com/dropwizard/metrics/blob/3.2-development/metrics-core/src/main/java/com/codahale/metrics/EWMA.java#L86-L95
public void tick() {
final long count = uncounted.sumThenReset();
final double instantRate = count/interval;
if (initialized) {
rate += (alpha * (instantRate - rate));
} else {
rate = instantRate;
initialized = true;
}
}
限り、私はあなたが正しいと見ることができるようおかげで、
マリアン
これまでのところ、私はそれを開いたままにしていますので、著者の誰かがこれに気付くかもしれません。 – Xenon