2016-08-03 16 views
0

Ich habe eine Situation, in der ein Thread Int aktualisiert und ein anderer zu einem bestimmten Zeitpunkt liest es. Also Single-Reader Single-Writer. Bisher habe ich volatile int für diesen Zweck verwendet, aber da dies die vollständige Synchronisierung auf Speicherbarrieren erzwingt, habe ich über etwas anderes nachgedacht.Inkrementieren int-Zähler mit Sichtbarkeit

Ein Ansatz wäre AtomicInteger.incrementAndGet() aber ich denke, das hat genau die gleiche Wirkung und wird tatsächlich langsamer

Ein anderer Ansatz wäre AtomicInteger.lazySet mit zusätzlichen nichtflüchtigen für Schriftsteller Zähler zu verwenden. Also im Grunde würden wir

private int counter; 
public AtomicInteger visibleCounter = new AtomicInteger(); 

private void write() { 
    counter++ 
    visibleCounter.lazySet(counter) 
} 

// called by reader 
public int isCountEqual(int val) { 
    return val == visibleCounter.get() 
} 

als naive "lazyIncrement" haben.

Wäre es tatsächlich performanter als einfaches Inkrement von volatile Int von Writer?

Dank

+0

Das klingt wie eine sehr seltsame Vorgehensweise nicht sehr falsch zu sagen, warum brauchen Sie, dies zu tun ? Haben Sie ein Problem in Ihrer Anwendung, das damit zusammenhängt? –

+0

Also ist es kein Problem für Sie, wenn der Leser einen alten Wert liest? – Kayaman

+0

Nein, es ist kein Problem, solange irgendwann 10ms usw. Ich werde das richtige Ergebnis erhalten, d. H. Val == visibleCounter – ivenhov

Antwort

1

Wenn faul Schritt eine der Optionen, die ich LongAdder vorschlagen würde. link LongAdder ist gut für Updates mit mehreren Threads.

... unter hohen Konkurrenz, diese Klasse erwartete Durchsatz ist signifikant höher (als AtomicLong)

+0

Ich hätte es erwähnen sollen. Ich bin immer noch auf Java 1.7 und ich bin mir nicht sicher, ob das Aktualisieren von Long performanter als das von Int wäre – ivenhov