Processus détaillé de mise à niveau du verrouillage synchronisé

 

Table des matières

1. Bases de la mise à niveau du verrouillage

1) Verrouillage de biais

2) Verrouillage léger (spin lock)

3) Serrure lourde

2. Pourquoi existe-t-il un processus de mise à niveau du verrou ?

1) Réduire les frais généraux des opérations de synchronisation sans concurrence

2) Essayez d’éviter les frais généraux liés au changement de thread

3) Réduire la consommation de mémoire

4) Améliorer le débit du système

3. Processus spécifique de mise à niveau du verrouillage

1. Bases de la mise à niveau du verrouillage

1) Verrouillage de biais

        Lorsqu'il n'y a qu'un seul thread en compétition pour la ressource de verrouillage , le propriétaire du thread est identifié comme le thread actuel. Le verrouillage biaisé est introduit pour minimiser la surcharge des opérations de synchronisation sans conflit. Lorsqu'un thread accède au bloc synchronisé et acquiert le verrou de l'objet, la marque de verrouillage est enregistrée dans le cadre de pile du thread et l'ID de thread dans l'en-tête de l'objet est défini sur l'ID du thread actuel. Ensuite, lorsque ce thread demande à nouveau le verrou pour le même objet, la machine virtuelle utilise la marque de verrouillage enregistrée sans entrer à nouveau dans le bloc de synchronisation.

2) Verrouillage léger (spin lock)

        Un ou plusieurs threads se disputent le verrou via CAS. S'ils ne peuvent pas saisir le verrou, ils continueront à tourner . La machine virtuelle copie le Mark Word de l'objet dans le cadre de pile du thread en tant qu'enregistrement de verrouillage et tente d'utiliser l'opération CAS (Compare and Set) pour acquérir le verrou. Si CAS réussit , cela signifie que le thread a acquis le verrou léger et continue d'exécuter le bloc synchronisé. Si CAS échoue, cela signifie qu'il y a une concurrence et que la machine virtuelle attend que d'autres threads libèrent le verrou via la rotation.

3) Serrure lourde

Si l'attente de rotation échoue, la machine virtuelle mettra à niveau le verrou léger vers un verrou lourd . Dans cet état, la machine virtuelle bloque le thread et utilise le mutex du système d'exploitation pour libérer et acquérir le verrou.

Il convient de noter que la mise à niveau du verrouillage est un processus de mise à niveau étape par étape et qu'il n'y aura pas de rétrogradation . En d’autres termes, une fois qu’un verrou est amélioré à un niveau supérieur, il ne peut pas revenir à un niveau inférieur.

2. Pourquoi existe-t-il un processus de mise à niveau du verrou ?

        Le processus de mise à niveau du verrouillage est conçu pour offrir de meilleures performances et un meilleur débit et réduire la surcharge causée par les conflits multithreads . Voici quelques raisons pour le processus de mise à niveau du verrou :

1) Réduire les frais généraux des opérations de synchronisation sans concurrence

        Dans un environnement multithread, s'il n'y a pas de concurrence, chaque thread peut accéder en toute sécurité aux ressources partagées sans synchronisation. La première étape du processus de mise à niveau du verrouillage, le verrouillage biaisé (Biased Locking), consiste à réduire la surcharge des opérations de synchronisation sans concurrence . Il évite les opérations de verrouillage et de déverrouillage en enregistrant les ID de thread et améliore les performances de l'accès monothread aux blocs de code synchronisés .

2) Essayez d’éviter les frais généraux liés au changement de thread

        La deuxième étape du processus de mise à niveau du verrouillage, le verrouillage léger (Lightweight Locking), consiste à réduire le coût du changement de thread . Il utilise l' opération CAS (Compare and Set) pour tenter d'acquérir le verrou. S'il réussit, il peut continuer à exécuter le bloc synchronisé sans changer de thread ; s'il échoue, il effectuera une opération de rotation et attendra que le verrou soit libéré. L'opération de rotation évite les frais généraux liés à la suspension et à la commutation des threads et améliore les performances lors d'une compétition multi-thread.

3) Réduire la consommation de mémoire

        La deuxième étape du processus de mise à niveau du verrou, le verrou léger, utilise une partie des bits de l'en-tête de l'objet pour stocker l'ID du thread et la balise de verrouillage , et ne nécessite pas de mémoire supplémentaire pour stocker l'état du verrouillage. Par rapport aux verrous lourds traditionnels, il peut économiser la consommation de mémoire.

4) Améliorer le débit du système

        Le processus de mise à niveau des verrous permet à plusieurs threads d'acquérir rapidement des verrous sans concurrence, évitant ainsi la surcharge de blocage et d'attente des threads. De cette façon, le débit du système sera plus élevé car davantage de threads pourront effectuer des tâches simultanément.

Dans l'ensemble, le processus de mise à niveau du verrouillage vise à améliorer les performances et le débit dans un environnement multithread , à réduire les frais généraux des opérations de synchronisation et à essayer d'éviter les frais généraux liés au changement de thread . La machine virtuelle Java met automatiquement à niveau et rétrograde les verrous en fonction de la concurrence des threads et de l'utilisation des verrous afin d'optimiser les performances des programmes multithread.

3. Processus spécifique de mise à niveau du verrouillage

1) Lorsqu'il n'y a qu'un seul thread en compétition pour le verrou, le verrou biaisé sera utilisé en premier, ce qui doit donner une marque indiquant que le verrou est maintenant occupé par le fil a.
2) Plus tard, le fil b et le fil c sont arrivés, demandant pourquoi vous le détenez. Le verrou nécessite une concurrence loyale, donc le logo est supprimé, c'est-à-dire que le verrou biaisé est révoqué et mis à niveau vers un verrou léger . Les trois threads sont en compétition pour le verrou via la rotation CAS (en fait, ce verrou saisissant Le processus est toujours orienté vers le détenteur d'origine). Les threads qui préfèrent les verrous).
3) Maintenant, le thread a occupe le verrou, le thread b et le thread c ont essayé d'acquérir le verrou dans une boucle. Plus tard, dix autres threads sont venus et ont été conservés. en rotation. Attendre ainsi est également un gaspillage de ressources CPU. Par conséquent, le verrou est mis à niveau vers un verrou lourd , demande des ressources au noyau et bloque directement le thread en attente .

 

Je suppose que tu aimes

Origine blog.csdn.net/weixin_71921932/article/details/131371017
conseillé
Classement