マルチスレッド System.out.println() インターリーブ: スレッド セーフティのジレンマ
疑問が生じます: System.out から出力できるか複数のスレッドによる .println(String) は、 synchronization?
API はスレッド セーフに関して沈黙を保っており、疑問の余地が残されています。インターリーブ出力は理論的には可能ですが、実際はバッファリング、メモリ モデル、または JVM 実装により異なる場合があります。
たとえば、各スレッドが System.out.println("ABC") を実行する場合、次のようになります。出力は「ABCnABC」となり、インターリーブがないことを示します。ただし、「AABCnBC」も考えられます。
難題への対処
API ドキュメントでは、System.out のスレッド セーフが保証されておらず、インターリーブが可能であることを示唆しています。それにもかかわらず、一部の JVM 実装では、println 内のスレッドセーフ メカニズム (glibc の printf など) を利用して、出力の忠実性を確保する場合があります。
ただし、JVM 固有の実装に依存するのは危険です。出力の完全な整合性を確保するには、手動の相互排他が必要です。
public void safePrintln(String s) { synchronized (System.out) { System.out.println(s); } }
これは、すべてのコードが一貫してsafePrintlnを使用し、System.out.printlnへの直接呼び出しを回避する場合にのみインターリーブを防止することに注意してください。
以上がSystem.out.println() はマルチスレッド Java でスレッドセーフですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。