Unsicher ist der Eckpfeiler des java-lockfreien Betriebs und ist in lockfreien Parallelitätsklassen unverzichtbar. Beispielsweise werden Concurrenthashmap und ConcurrentLinkedQueue von der unsicheren Klasse implementiert. Im Vergleich zu Schlössern in Java hat es im Grunde keinen Overhead und wird warten. In diesem Artikel wird hauptsächlich die Hauptoperationen in unsicherem Vorgang vorgestellt.
1 Vergleichewap
/*** Vergleichen Sie den Wert im Speicherort am Offset von OBJ und den erwarteten Wert und aktualisieren Sie, wenn dieselben. Dieses Update ist nicht unterbrochen. ** @Param OBJ -Objekt, das aktualisiert werden muss aktualisieren);
Dies ist die berühmte CAS -Operation, die in drei Schritte unterteilt ist
Die CAS -Familie enthält auch VergleicheAnDSWAPObject (), vergleicheStwaplong (), vergleicheSwapint () usw.
Verwenden Sie ein klassisches Beispiel von AtomicInteger, um zu veranschaulichen:
public Final int getandadd (int delta) {return unafe.getandAdDint (this, ValueOffset, Delta);} // unafe.getandadDintpublic Final int getandadDint (Objekt var1, long var2, int var4) {int var5; do { / ** den ursprünglichen Wert abrufen* / var5 = this.getIntvolatile (var1, var2); / ** Bestätigen Sie, dass der ursprüngliche Wert nicht von anderen Threads geändert wurde, und führen Sie dann den Aktualisierung von Var5 + VAR4 -Operation*/} while (! Dies.ConPareNdswapint (var1, var2, var5, var5 + var4)). return var5;}2 PutOrder
/**** Legt den Wert des Integer -Feldes auf dem angegebenen Offset im* angegebenen Objekt zum angegebenen Wert fest. Dies ist eine geordnete oder faule Version von <Code> putintvolatile (Objekt, lang, int) </code>, die * die sofortige Sichtbarkeit der Änderung auf andere * Threads nicht garantiert. Es ist nur sehr nützlich, wenn das Integer -Feld * <Code> volatil </code> ist und sich daher unerwartet ändert. * * @param obj das Objekt, das das Feld enthält, um zu ändern. * @Param Versatz den Offset des Integer -Feldes in <Code> obj </code>. * @param bewerten den neuen Wert des Feldes. * @see #putintvolatile (Objekt, lang, int) */ public native void putorderedInt (Objekt OBJ, langer Offset, int -Wert);
Ändern Sie die Position, an der der Versatz des OBJ -Objekts an Wert ausgefallen ist, da in Java keinen Speichervorgang vorliegt, und dieser Betrieb von Unsicherheit ergänzt nur den unzureichenden Speichervorgang. Es kann auch für Array -Operationen verwendet werden, wie z. B. Concurrenthashmap für eine große Anzahl von Gebrauch
Segment <K, v> S0 = neues Segment <k, v> (loadFactor, (int) (Cap * loadFactor), (Hashentry <K, v> []) New Hashentry [Cap]); Segment <K, v> [] SS = (Segment <k, v> []) neues Segment [ssize]; // Schreiben Sie S0 in die Position, in der das Array auf 0 abonniert wird: ss [0] = S0 unsicher. // bestelltes Schreiben von Segmenten [0]
Es ist zu beachten, dass OBJ auf volatil eingestellt werden muss, andernfalls ist es für andere Threads unsichtbar.
3 putxxxvolatile
/**** Legt den Wert des Integer -Feldes auf dem angegebenen Offset im gelieferten Objekt zum angegebenen Wert mit flüchtiger Semantik fest. * * @param obj das Objekt, das das Feld enthält, um zu ändern. * @Param Versatz den Offset des Integer -Feldes in <Code> obj </code>. * @param bewerten den neuen Wert des Feldes. */ public native void putintvolatile (Objekt OBJ, Long Offset, int Value);
Es fühlt sich genauso an wie PutOrderint, weil es auf volatil eingestellt sein muss. Ansonsten nützt es?
Das obige sind alle Wissenspunkte, die ich Ihnen dieses Mal mit Ihnen geteilt habe. Vielen Dank für Ihre Unterstützung bei Wulin.com.