Si votre code est dans un processus qui a plusieurs threads en cours en même temps, il peut exécuter le code en même temps. Si le résultat de chaque exécution est le même que celui d’un seul thread, et que les valeurs des autres variables sont les mêmes qu’attendues, c’est sûr pour les threads. En d’autres termes, l’interface fournie par une classe ou un programme est atomique pour les threads ou le passage entre plusieurs threads ne conduit pas à une ambiguïté dans le résultat d’exécution de l’interface, ce qui signifie que nous n’avons pas besoin de prendre en compte la synchronisation. Les problèmes de sécurité des threads sont causés à la fois par des variables globales et statiques. Si chaque thread n’a que des opérations de lecture pour les variables globales et les variables statiques, mais pas d’opérations d’écriture, en général, cette variable globale est thread-safe ; Si plusieurs threads effectuent simultanément des opérations de lecture et d’écriture sur une variable, la synchronisation des threads est généralement nécessaire, sinon cela peut affecter la sécurité du thread.
Le but du verrou est d’empêcher les opérations concurrentes lors de l’exécution multi-thread, et les objets du type de référence permettent à un seul thread d’opérer à la fois dans sa zone verrouillée.
Le verrou ne peut verrouiller qu’une seule variable de type de référence, c’est-à-dire verrouiller une adresse
Il existe une différence entre les résultats de l’exécution avec et sans verrouillage :
Après verrouillage : la valeur de i diminuera un par un, il n’y aura ni sauts, ni sortie répétée, jusqu’à la valeur de 0 ;
Pas de verrouillage : la valeur sortie de i sautera, décroissant discontinu, et peut aussi avoir une sortie de -1 ;
Raison : Après avoir ajouté un verrou, un seul thread peut exécuter le code dans la zone verrouillée à la fois, et les deux threads sont exécutés dans l’ordre, donc il n’y aura pas de sortie interrompue. |