Maison >Java >javaDidacticiel >Pourquoi « i » n'est-il pas atomique en Java ?

Pourquoi « i » n'est-il pas atomique en Java ?

DDD
DDDoriginal
2024-11-26 14:48:11484parcourir

Why Isn't `i  ` Atomic in Java?

Pourquoi i n'est-il pas atomique en Java ?

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 :

  1. Lecture de la valeur actuelle de la variable
  2. Incrémentation de la valeur
  3. Réécriture de la nouvelle valeur dans le variable

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn