Avec le développement vigoureux d'Internet, de plus en plus de sociétés Internet sont confrontées à des problèmes de sécurité simultanés causés par l'expansion du volume des utilisateurs. Cet article se concentre sur plusieurs mécanismes de verrouillage communs dans la concurrence de Java.
1. Verrouillage positif
Le verrouillage biaisé est un mécanisme d'optimisation de verrouillage proposé par JDK1.6. L'idée principale est que si le programme ne rivalise pas, l'opération de synchronisation du thread qui a précédemment obtenu le verrou sera annulé. C'est-à-dire que si un verrou est acquis par un fil, il entre en mode biais. Lorsque le thread demande à nouveau le verrou, il n'est pas nécessaire d'effectuer des opérations de synchronisation pertinentes, ce qui permet de gagner du temps d'opération. Si d'autres threads font des demandes de verrouillage entre les deux, le verrouillage quitte le mode biais. Utilisation de -xx: + usebiased blocking dans JVM
package jvmproject; import java.util.list; import java.util.vector; public class biaisé {public static list <Integer> numberList = new Vector <Integer> (); public static void main (String [] args) {long début = System.currentTimemillis (); int count = 0; int startNum = 0; while (count <10000000) {nombreList.add (startNum); startnum + = 2; Count ++; } long fin = System.currentTimemillis (); System.out.println (End-Begin); }}Initialisez un vecteur, ajoutez 100 000 000 d'objets entiers à lui, puis sur le décalage horaire. Ceci est utilisé pour tester les performances des serrures biaisées. Quant à pourquoi vous devriez utiliser Vector au lieu de ArrayList?
Étant donné que ArrayList est insensible à thread, le vecteur est fileté. Cela peut ne pas être suffisamment spécifique, vous pouvez consulter le code source.
Presque toutes les opérations dans Vector sont sychronisées, tandis que ArrayList ne le fait pas, donc le vecteur est en file d'attente.
Ensuite, testons l'impact de l'ouverture des verrous biaisés et non des verrous biaisés sur les performances du programme.
Configurez les paramètres de démarrage JVM (activer le verrouillage de biais) vers:
Configurez les paramètres JVM StartUp (Fermer Biais Lock) vers:
Parfait! Le temps d'exécution du programme qui permet un verrouillage biaisé est nettement plus court. Il a certains avantages d'activer les verrous biaisés que de ne pas activer les verrous biaisés. La méthode de synchronisation pour faire fonctionner un objet dans un seul thread. En fait, il peut également être compris de cette manière. Lorsqu'il n'y a qu'un seul thread fonctionnant d'un objet vectoriel avec une méthode de synchronisation, l'opération sur le vecteur sera convertie en une opération sur l'arrayList.
La serrure biaisée n'a pas d'effet d'optimisation fort lorsque le verrou est compétitif, car une grande quantité de concurrence entraînera le fil de filetage en continu, et il est difficile pour le verrouillage de rester en mode biaisé. À l'heure actuelle, l'utilisation du serrure biaisée n'atteint pas seulement l'optimisation des performances, mais peut réduire les performances du système. Par conséquent, dans le cas d'une concurrence féroce, vous pouvez essayer de l'utiliser.
-Xx: -UsuseBiasted blocking paramètre désactive le verrouillage du biais.
2. Verrouillage léger
Si le verrouillage biaisé échoue, la machine virtuelle Java demandera au thread de demander un verrou léger. Le verrouillage léger est implémenté à l'intérieur de la machine virtuelle et est implémenté à l'aide d'un objet qui devient un objet BasicObject, qui est composé d'un objet Basiclock et d'un pointeur d'objet Java tenant le verrou. L'objet BasicObjectLock est placé dans le cadre de pile Java. Le champ affiché_header est également maintenu à l'intérieur de l'objet Basiclock, qui est utilisé pour sauvegarder le mot de marque de l'en-tête de l'objet.
Lorsqu'un fil tient le verrou d'un objet, les informations du mot de marque de l'objet sont les suivantes
[ptr | 00] verrouillé
Les deux bits à la fin sont 00, et le mot de marque entier est un pointeur vers l'objet Basiclock. Étant donné que l'objet BasicObjectlock est dans la pile de threads, le pointeur doit pointer vers l'espace de pile de thread qui maintient le verrou. Lorsqu'il est nécessaire de déterminer si un thread maintient l'objet, il est nécessaire de simplement déterminer si le pointeur de l'en-tête d'objet se trouve dans la plage d'adresse de pile du thread actuel. Dans le même temps, la tête affichée de l'objet Basiclock sauvegarde le contenu du mot de marque de l'objet d'origine, et le champ OBJ de l'objet BasicObjectLock pointe vers la tête de l'objet tenant le verrou.
3. Verrouillage des poids lourds
Lorsque le verrouillage léger échoue, la machine virtuelle utilisera le verrouillage des poids lourds. Lorsque vous utilisez des serrures poids lourds, le mot de marque de l'objet est le suivant:
[PTR | 10] Moniteur
Pendant le fonctionnement, le thread peut être suspendu au niveau du système d'exploitation. Si c'est le cas, le coût de la commutation et de l'appel entre les fils sera considérablement augmenté.
4. Verrouiller
Un verrouillage de spin peut rendre le fil non suspendu lorsqu'il n'a pas obtenu le verrou, mais à la place pour exécuter une boucle vide (c'est-à-dire le soi-disant spin, ce qui signifie exécuter la boucle vide elle-même). Si le fil peut obtenir le verrou après plusieurs boucles vides, elle continuera de s'exécuter. Si le fil ne peut toujours pas obtenir le verrou, il sera suspendu.
Après avoir utilisé le verrouillage de spin, le risque de suspension du thread est relativement réduit et la cohérence de l'exécution du thread est relativement améliorée. Par conséquent, il a une certaine signification positive pour les fils simultanés qui ne sont pas très compétitifs avec les serrures et qui ont très peu de temps. Cependant, pour les programmes simultanés qui sont farouchement compétitifs avec les serrures et les serrures unique occupent longtemps, le verrou de rotation ne peut souvent pas obtenir la serrure correspondante après l'attente de la rotation. Cela ne lance pas seulement le temps de processeur, mais a également inévitablement l'opération en suspension à la fin, mais gaspille également les ressources du système.
Dans JDK1.6, la machine virtuelle Java fournit le paramètre -xx: + usespinning pour activer le verrouillage de spin et utilise le paramètre -xx: préblockspin pour définir le nombre de fois que le verrouillage de spin attend.
À partir de JDK 1.7, les paramètres du verrouillage de spin sont annulés. La machine virtuelle ne prend plus en charge le verrouillage de spin configuré par l'utilisateur. Le verrou de spin sera toujours exécuté et le nombre de verrous de spin est automatiquement ajusté par la machine virtuelle.