Maison >Java >javaDidacticiel >Plusieurs threads peuvent-ils entrelacer la sortie lors de l'utilisation de System.out.println() ?

Plusieurs threads peuvent-ils entrelacer la sortie lors de l'utilisation de System.out.println() ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-21 16:58:11230parcourir

Can Multiple Threads Interleave Output When Using System.out.println()?

La sortie System.out.println de plusieurs threads peut-elle être entrelacée ?

En Java, la classe System.out fournit une méthode println pour imprimer des messages sur la console. Cependant, il existe une certaine ambiguïté quant à savoir si la sortie de plusieurs threads appelant cette méthode peut être entrelacée.

Documentation API

La documentation de l'API Java pour System.out n'indique pas explicitement s'il s'agit d'un thread- sûr ou pas. En tant que tel, on ne peut pas supposer que la sortie de plusieurs threads sera cohérente.

Entrelacement potentiel

En théorie, il est possible que la sortie de plusieurs threads soit entrelacée. Cela peut se produire si l'implémentation sous-jacente de la machine virtuelle Java (JVM) ne garantit pas les opérations d'écriture atomique pour System.out.println. Dans de tels cas, la sortie pourrait devenir tronquée, avec des caractères de différents messages apparaissant entrecoupés.

Exemple de cas

Par exemple, considérons le code suivant :

Thread thread1 = new Thread(() -> System.out.println("ABC"));
Thread thread2 = new Thread(() -> System.out.println("ABC"));

thread1.start();
thread2.start();

Dans Dans cet exemple, il est possible (mais non garanti) que la sortie apparaisse entrelacée, comme suit :

AABC
BC

JVM Implémentation

En pratique, le comportement réel peut dépendre de l'implémentation spécifique de la JVM. Certaines JVM peuvent optimiser la classe System.out pour garantir les opérations d'écriture atomique, empêchant ainsi l'entrelacement. Cependant, cela n'est pas garanti sur toutes les plates-formes et implémentations.

Application de l'exclusion mutuelle

Pour garantir que la sortie de plusieurs threads n'est pas entrelacée, vous pouvez appliquer manuellement l'exclusion mutuelle à l'aide du mot-clé synchronisé. Par exemple :

public synchronized void safePrintln(String s) {
  System.out.println(s);
}

En protégeant l'objet System.out avec un verrou, cette méthode garantit qu'un seul thread peut y accéder à un moment donné. En conséquence, la sortie sera cohérente et non entrelacée.

N'oubliez pas qu'il est crucial d'utiliser cette méthode de manière cohérente tout au long de votre code. Si un thread appelle directement System.out.println, la sortie peut toujours être entrelacée.

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