Disape est la pierre angulaire de l'opération sans serrure Java, et ils sont indispensables dans les classes de concurrence sans serrure. Par exemple, concurrenthashmap et concurrentLinkedQueue sont tous mis en œuvre par la classe dangereuse. Comparé aux serrures à Java, il n'a essentiellement pas de frais généraux et attendra en place. Cet article présente principalement les principales opérations en dangere.
1 comparaison
/ *** Comparez la valeur dans l'emplacement de la mémoire au décalage d'OBJ et la valeur attendue, et mettez à jour si la même chose. Cette mise à jour n'est pas interrompue. * * @param obj objet qui doit être mis à jour * @param décalage le décalage du champ entier dans obj * @param attendez la valeur attendue dans le champ * @param mise à jour si la valeur attendue s'attend est la même que la valeur actuelle du champ, définissez la valeur de la valeur déposée sur cette nouvelle valeur * @return Si la valeur du champ est modifiée, Retour INTR, INTERNET PUBLIQUE Boolean Comparandswa mise à jour);
Ceci est la célèbre opération CAS, qui est divisée en trois étapes
La famille CAS comprend également CompareAndSwapObject (), CompareAndSwapLong (), CompareAndSwapint (), etc.
Utilisez un exemple classique d'AtomicInteger pour illustrer:
public final int getAndAdd (int delta) {return usare.getAndAddint (this, ValueOffset, delta);} // unsetafe.getAndAddintPublic final int GetAndAddnt (objet var1, long var2, int var4) {int var5; do {/ ** Obtenez la valeur d'origine * / var5 = this.getIntVolatile (var1, var2); / ** Confirmez que la valeur d'origine n'a pas été modifiée par d'autres threads, puis effectuez l'opération de mise à jour Var5 + Var4 * /} while (! This.compareAndswapint (var1, var2, var5, var5 + var4)); return var5;}2 putorder
/ *** * Définit la valeur du champ entier au décalage spécifié dans l'objet * fourni à la valeur donnée. Il s'agit d'une version ordonnée ou paresseuse * de <code> Pountvolatile (objet, long, int) </code>, qui * ne garantit pas la visibilité immédiate de la modification des autres threads *. Il n'est vraiment utile que lorsque le champ entier est * <code> volatile </code>, et devrait donc changer de manière inattendue. * * @param obj L'objet contenant le champ à modifier. * @param décalage le décalage du champ entier dans <code> obj </code>. * @param valeur la nouvelle valeur du champ. * @See #putIntVolatile (objet, long, int) * / public native void putOrDeDInt (objet obj, décalage long, valeur int);
Modifier la position où le décalage de l'objet OBJ est décalé à la valeur, car il n'y a pas de fonctionnement de mémoire en Java, et cette opération de dangereuse complète simplement l'opération de mémoire insuffisante. Il peut également être utilisé pour les opérations de réseau, telles que concurrenthashmap pour un grand nombre d'utilisation
Segment <k, v> s0 = nouveau segment <k, v> (chargefactor, (int) (cap * loadfactor), (hashentry <k, v> []) new hashentry [cap]); Segment <k, v> [] ss = (segment <k, v> []) nouveau segment [ssize]; // Écrivez S0 à la position où le tableau est indiqué à 0: SS [0] = S0 UNSATE. // a ordonné l'écriture de segments [0]
Il convient de noter que l'OBJ doit être réglé sur volatile, sinon il sera invisible pour les autres threads.
3 putxxxvolatile
/ *** * Définit la valeur du champ entier au décalage spécifié dans l'objet * fourni à la valeur donnée, avec une sémantique de magasin volatile. * * @param obj L'objet contenant le champ à modifier. * @param décalage le décalage du champ entier dans <code> obj </code>. * @param valeur la nouvelle valeur du champ. * / public natif void Pountvolatile (objet obj, décalage long, valeur int);
Il se sent la même chose que PutOrderInt, car il doit être défini sur volatil, sinon à quoi sert-il?
Ce qui précède est tous les points de connaissance que j'ai partagés avec vous cette fois. Merci pour votre soutien à wulin.com.