ホームページ >Java >&#&チュートリアル >System.out.println() を使用する場合、複数のスレッドで出力をインターリーブできますか?

System.out.println() を使用する場合、複数のスレッドで出力をインターリーブできますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-21 16:58:11272ブラウズ

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

複数のスレッドからの System.out.println 出力はインターリーブできますか?

Java では、System.out クラスは、メッセージをコンソールに出力するための println メソッドを提供します。ただし、このメソッドを呼び出す複数のスレッドからの出力をインターリーブできるかどうかについては、あいまいさがいくつかあります。

API ドキュメント

System.out の Java API ドキュメントには、スレッドかどうかが明示的に記載されていません。安全かどうか。そのため、複数のスレッドからの出力が一貫しているとは想定できません。

インターリーブの可能性

理論的には、複数のスレッドからの出力がインターリーブされる可能性があります。これは、Java 仮想マシン (JVM) の基礎となる実装が System.out.println のアトミックな書き込み操作を保証していない場合に発生する可能性があります。このような場合、出力が文字化けし、さまざまなメッセージの文字が散在して表示される可能性があります。

例のケース

たとえば、次のコードを考えてみましょう。

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

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

Inこの例では、次のように出力がインターリーブされる可能性があります (ただし、保証はありません)。

AABC
BC

JVM 実装

実際には、実際の動作は特定の JVM 実装に依存する可能性があります。一部の JVM は、アトミックな書き込み操作を保証し、インターリーブを防止するために System.out クラスを最適化する場合があります。ただし、これはすべてのプラットフォームと実装で保証されるわけではありません。

相互排除の強制

複数のスレッドからの出力がインターリーブされないようにするには、synchronized キーワードを使用して手動で相互排他を強制できます。例:

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

このメソッドは、System.out オブジェクトをロックで保護することにより、常に 1 つのスレッドのみがそのオブジェクトにアクセスできることを保証します。その結果、出力は一貫性があり、インターリーブされません。

コード全体でこのメソッドを一貫して使用することが重要であることに注意してください。いずれかのスレッドが System.out.println を直接呼び出した場合でも、出力はインターリーブされる可能性があります。

以上がSystem.out.println() を使用する場合、複数のスレッドで出力をインターリーブできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。