マルチスレッドの System.out.println 出力をインターリーブできますか?
System.out.println(String) の Java API が欠落しています明示的な同期の保証により、複数の出力のインターリーブに関する疑問が生じます。
出力はインターリーブされますか?
同期がないと、複数のスレッドからの出力がインターリーブされる可能性があります。これは、異なるスレッドの文字が 1 行の出力内に混在する可能性があることを意味します。
たとえば、複数のスレッドがコードを実行しているとします。
System.out.println("ABC");
期待される出力は次のようになります。
ABC ABC
ただし、インターリーブにより結果が生じる可能性がありますin:
AABC BC
バッファリングはインターリーブを防止しますか?
バッファリングと VM メモリ モデルは場合によってはインターリーブを防止できる可能性がありますが、これを信頼することはできません。 Java API 仕様では、System.out.println のアトミック ライン書き込みは保証されていません。
非インターリーブ出力の確保
インターリーブを防止し、出力が同期されていることを確認するには、手動同期を強制する必要があります。これは、同期ブロックを使用するか、Java ライブラリによって提供されるスレッドセーフな印刷メソッドを利用することによって実現できます。
たとえば、次のコードは、同期ブロックを System.out.println に追加します。
public void safePrintln(String s) { synchronized (System.out) { System.out.println(s); } }
コード全体でこのメソッドを一貫して使用することにより、出力インターリーブを排除し、異なるスレッドからのラインが分離され、整然とした状態を保つことができます。
以上がマルチスレッドの「System.out.println」出力をインターリーブできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。