2017-01-06 3 views
1

Ich habe ein Programm läuft Multi-Thread, alle Thread-Freigabe und Prozess auf einzelne AtomicLong-Variable. Jeder von ihnen ruft zuerst die Methode auf, um den Wert abzurufen und weiter zu verarbeiten.Führt die getAndAdd-Methode in AtomicLong dazu, dass Threads warten?

Wenn alle Threads gleichzeitig ausgeführt werden, führt das Aufrufen der obigen Methode dazu, dass ein Thread wartet, bis ein anderer Thread den Wert erreicht hat.

Antwort

3

Die Threads warten nicht (im Sinne von Object::wait), sie sind Schleifen, bis sie erfolgreich zu bekommen und zu der AtomicLong hinzufügen.

Als Referenz sieht the code in JDK 8 wie folgt aus:

public final long getAndAddLong(Object o, long offset, long delta) { 
    long v; 
    do { 
    v = getLongVolatile(o, offset); 
    } while (!compareAndSwapLong(o, offset, v, v + delta)); 
    return v; 
} 

Beachten Sie, dass das Verfahren intrinsisch sein kann

+0

(dh es zur Laufzeit von etwas effizienter, in der Regel eine einzige CPU-Befehl ersetzt wird) Sie sind Looping , Sie meinen, sie werden nichts tun, bis sie den Wert bekommen? Ich frage mich, hat es Auswirkungen auf die Leistung? –

+0

Sie werden nichts tun, sie werden Schleife (busy-waiting), so dass sie 100% CPU verwenden. Aber das wird unter normalen Wettbewerbsbedingungen nicht lange dauern. Wenn Ihr Programm natürlich tausende von Threads hat, die nichts tun als "getAndAdd", werden Sie eine hohe CPU-Auslastung feststellen, aber das ist ein unrealistisches Szenario. – assylias

+0

Siehe auch: http://stackoverflow.com/questions/2664172/java-concurrency-cas-vs-locking – assylias

Verwandte Themen