ホームページ > Java > &#&チュートリアル > マルチスレッドの「System.out.println」出力をインターリーブできますか?

マルチスレッドの「System.out.println」出力をインターリーブできますか?

DDD
リリース: 2024-12-04 17:03:11
オリジナル
1000 人が閲覧しました

Can Multi-threaded `System.out.println` Output Be Interleaved?

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

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