ホームページ > Java > &#&チュートリアル > System.out.println() はマルチスレッド Java でスレッドセーフですか?

System.out.println() はマルチスレッド Java でスレッドセーフですか?

Mary-Kate Olsen
リリース: 2024-12-07 13:52:12
オリジナル
763 人が閲覧しました

Is System.out.println() Thread-Safe in Multithreaded Java?

マルチスレッド 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート