La sortie multithread System.out.println peut-elle être entrelacée ?
L'API Java pour System.out.println(String) manque des garanties de synchronisation explicites, soulevant des questions sur l'entrelacement des sorties de plusieurs threads.
La sortie peut-elle être obtenue Entrelacé ?
Sans synchronisation, il est possible que la sortie de plusieurs threads soit entrelacée. Cela signifie que les caractères de différents threads peuvent être mélangés dans une seule ligne de sortie.
Par exemple, considérons plusieurs threads exécutant le code :
System.out.println("ABC");
Le résultat attendu devrait être :
ABC ABC
Cependant, l'entrelacement pourrait entraîner :
AABC BC
La mise en mémoire tampon empêche-t-elle Entrelacement ?
Bien que la mise en mémoire tampon et le modèle de mémoire de la VM puissent potentiellement empêcher l'entrelacement dans certains cas, on ne peut pas s'y fier. La spécification de l'API Java ne garantit pas les écritures de lignes atomiques pour System.out.println.
Assurer une sortie non entrelacée
Pour éviter l'entrelacement et garantir que la sortie est synchronisée, la synchronisation manuelle doit être appliquée. Ceci peut être réalisé en utilisant des blocs synchronisés ou en utilisant des méthodes d'impression thread-safe fournies par la bibliothèque Java.
Par exemple, le code suivant ajoute un bloc synchronisé à System.out.println :
public void safePrintln(String s) { synchronized (System.out) { System.out.println(s); } }
En utilisant cette méthode de manière cohérente tout au long du code, l'entrelacement des sorties peut être éliminé, garantissant ainsi que les lignes des différents threads restent séparées et ordonnées.
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!