Java では、System.out クラスは、メッセージをコンソールに出力するための println メソッドを提供します。ただし、このメソッドを呼び出す複数のスレッドからの出力をインターリーブできるかどうかについては、あいまいさがいくつかあります。
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 は、アトミックな書き込み操作を保証し、インターリーブを防止するために System.out クラスを最適化する場合があります。ただし、これはすべてのプラットフォームと実装で保証されるわけではありません。
複数のスレッドからの出力がインターリーブされないようにするには、synchronized キーワードを使用して手動で相互排他を強制できます。例:
public synchronized void safePrintln(String s) { System.out.println(s); }
このメソッドは、System.out オブジェクトをロックで保護することにより、常に 1 つのスレッドのみがそのオブジェクトにアクセスできることを保証します。その結果、出力は一貫性があり、インターリーブされません。
コード全体でこのメソッドを一貫して使用することが重要であることに注意してください。いずれかのスレッドが System.out.println を直接呼び出した場合でも、出力はインターリーブされる可能性があります。
以上がSystem.out.println() を使用する場合、複数のスレッドで出力をインターリーブできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。