En Java, l'opérateur i n'est pas atomique, ce qui signifie que si deux threads tentent d'incrémenter simultanément la même variable, l'opérateur i n'est pas atomique. le résultat peut être incorrect. En effet, l'opération i se compose de trois étapes distinctes :
Si deux threads exécutent ces étapes simultanément, il est possible qu'un thread lise la valeur avant que l'autre thread n'incrémente il. Cela peut entraîner une corruption des données.
Par exemple, considérons le code suivant :
class Test { private static int total = 0; public static void main(String[] args) { Thread thread1 = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 100000; i++) { total++; } } }); Thread thread2 = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 100000; i++) { total++; } } }); thread1.start(); thread2.start(); thread1.join(); thread2.join(); System.out.println("Total: " + total); } }
Lorsque ce code est exécuté, il est censé imprimer 200 000, mais il peut en réalité imprimer un nombre inférieur valeur en raison de la nature non atomique de l'opérateur i.
Pour garantir que le code multithread accède aux variables partagées de manière atomique, il est nécessaire d'utiliser des mécanismes de synchronisation tels que comme verrous ou variables atomiques. Le mot-clé synchronisé peut être utilisé pour synchroniser l'accès aux blocs de code, tandis que la classe AtomicInteger fournit un type entier atomique.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!