Entrelacement System.out.println() multithread : un dilemme de sécurité des threads
La question se pose : peut-il sortir de System.out .println(String) par plusieurs threads devient entrelacé s'il n'y a pas de synchronisation ?
L'API reste silencieuse sécurité du fil, laissant place au doute. Bien qu'une sortie entrelacée soit théoriquement réalisable, la réalité peut être différente en raison de la mise en mémoire tampon, des modèles de mémoire ou de l'implémentation de la JVM.
Par exemple, si chaque thread exécute System.out.println("ABC"), on pourrait attendez-vous à ce que la sortie soit "ABCnABC", indiquant l'absence d'entrelacement. Cependant, "AABCnBC" est également plausible.
Résoudre l'énigme
La documentation de l'API ne garantit pas la sécurité des threads pour System.out, ce qui implique que l'entrelacement est possible. Néanmoins, certaines implémentations JVM peuvent utiliser des mécanismes thread-safe dans println (comme printf de la glibc), garantissant la fidélité de la sortie.
Cependant, s'appuyer sur des implémentations spécifiques à la JVM est risqué. Pour garantir une intégrité complète de la sortie, une exclusion mutuelle manuelle est nécessaire :
public void safePrintln(String s) { synchronized (System.out) { System.out.println(s); } }
Notez que cela n'empêche l'entrelacement que si tout le code utilise systématiquement safePrintln et évite les appels directs à System.out.println.
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!