2016-04-01 6 views
4

Wir sammeln einige Statistiken mit AtomicLongs. Einige Benutzer sehen Konflikte bei diesen und haben stattdessen die Verwendung von LongAdder vorgeschlagen. Jedoch habe ich keine Möglichkeit sehen, den Maximalwert zu berechnen, wie wir derzeit mit dem Atomic tun:Mit LongAdder einen maximalen Wert für einen statistischen Zähler berechnen?

AtomicLong _current, _total, _max; 
... 

void add(long delta) 
{ 
    long current = _current.addAndGet(delta); 
    if (delta>0) 
    { 
    _total.addAndGet(delta); 
    long max = _max.get(); 
    while (current > max) 
    { 
     if (_max.compareAndSet(max, current)) 
     break; 
     max = _max.get(); 
    } 
} 

Deshalb denke ich, dass wir _total leicht genug, um mit einem LongAdder ersetzen können, sondern weil wir _current.addAndGet(delta) tun, die nicht gut für a LongAdder, noch können wir CAS-Operation für den `_max'-Wert tun.

Gibt es irgendwelche guten Algorithmen zum Sammeln solcher Statistiken basierend auf LongAdder oder ähnlichen skalierbaren, lockfreien Konstrukten?

Eigentlich, während ich frage, unsere Statistiken aktualisieren normalerweise 6 bis 10 AtomicLongs. Wenn es Streit gibt, könnte es vielleicht besser sein, einfach ein Schloss zu nehmen und 6 bis 10 normale Longs zu aktualisieren?

Antwort

3

Sie wollen nicht , aber LongAccumulator hier: Sie wollen new LongAccumulator(Math::max, Long.MIN_VALUE), die das Richtige hier tut. ist ein Spezialfall von LongAccumulator.

+0

Ah, das '_max' in einen' LongAccumulator' verwandelt, aber es hilft nicht mit der addAndGet-Semantik, die für '_current' benötigt wird. Es erlaubt aber immer noch 3 AtomicLongs durch 1 AtomicLong, 1 LongAdder und 1 LongAccumulator zu ersetzen – gregw

+1

@gregw: ob Sie es weiter vereinfachen können, hängt davon ab, was Sie tatsächlich mit diesen Werten außerhalb der von Ihnen geposteten Methode machen. Von dieser einzigen Methode, die Sie gezeigt haben, enthalten alle drei immer den gleichen Wert und könnten daher durch einen einzigen "LongAdder" ersetzt werden ... – Holger

+0

@Holger Die drei Werte sind nicht immer gleich, da negative Deltas übergeben werden können. – gregw

Verwandte Themen