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

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

DDD
Libérer: 2024-11-26 14:48:11
original
472 Les gens l'ont consulté

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);
  }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal