JavaのSystem.out.println()で揮発性

ナレンドラ・パタイ

私はSystem.out.println()、コードをスレッドセーフにすることを主張する多くの投稿を読んだので、レースをシミュレートするにSystem.out.println()は、コードから削除する必要があります。

これで、ストリームに書き込む前write()PrintStream同期するメソッドがオンthisになるため、write()呼び出されるたびにロックが保持され、解放されます。

write() PrintStreamのメソッド

public void write(int b) {
    try {
        synchronized (this) { //acquires a lock
        ensureOpen();
        out.write(b);
        if ((b == '\n') && autoFlush)
            out.flush();
        }
    }
    catch (InterruptedIOException x) {
        Thread.currentThread().interrupt();
    }
    catch (IOException x) {
        trouble = true;
    }
    }

しかし、それは人種の行動に影響を及ぼしますか?

仮定:

boolean flag = true;

Thread 1: 
System.out.println();
flag = false;
System.out.println();


Thread 2:
System.out.println();
while(flag){
    System.out.println();
}

これで、両方のスレッドが同じオブジェクト、つまりthis(PrintStream)をロックしていることがわかります。これは、同じロックを取得および解放しているflag2つの間に含まれているためsysoutsflag値はキャッシュからフラッシュされ、メモリ内で更新されます。スレッドはそれを見ることができます。

したがって、レースのシミュレーションは難しいので、このコードがスレッドセーフになり、スレッド2が変更を確認するという理論上の可能性はありflagますか?

はいの場合、同じ効果をvolatile使用して達成できSystem.out.println();ますか?

フライト

JLSには、このトピックについて次のように述べています。An unlock on a monitor happens-before every subsequent lock on that monitor.17.4.5

JLSで発生前などの正確な定義を読み取ることができますが、これは基本的に、ロックを解除する前にスレッドで発生したすべての読み取りと書き込みが、ロックを取得する別のスレッドによって認識されることを意味します。 (注意!ロックを取得せずにフラグに書き込んだスレッド3があった場合、同期は必要ありません)

この場合、同じオブジェクトをロックしているので、これは、はい、更新されたflag値がスレッド2によって認識される必要があることが保証されていることを意味します

PrintStreamがロックを取得し、スレッドセーフに使用できることが保証されていることについてはドキュメントに記載されていませんが、ここでは実装の詳細に依存しています(ただし、壊れることはほとんどありません)。 )。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

JavaのSystem.out.println()で揮発性

分類Dev

System.out.println-Java

分類Dev

System.out.println()で

分類Dev

Cでの静的揮発性vs静的vs揮発性

分類Dev

Pythonで揮発性のJavaと同等

分類Dev

Javaの違いStdOutとSystem.out.println

分類Dev

System.out.println()とJavaの\ n

分類Dev

JavaでのSystem.out.printlnの意味は何ですか?

分類Dev

Java 8での「System.out :: println」の使用とは

分類Dev

JavaでのSystem.out.printlnの奇妙な動作

分類Dev

Java LoggerとSystem.out.printlnの違いは何ですか

分類Dev

揮発性と不揮発性の混合

分類Dev

揮発性のみでDCLPを修正

分類Dev

intの揮発性?

分類Dev

Javaの揮発性変数

分類Dev

UnicodeでのJava System.out出力

分類Dev

System.out.println(object)の出力

分類Dev

JavascriptでのJavaのSystem.out.println()に相当するものは何ですか?

分類Dev

system.out.println()とprintln()のJavaの違い

分類Dev

Javaの「System.out.println()」と「toString()」の間の接続

分類Dev

Javaでの揮発性と同期の違い

分類Dev

C / C ++ / Javaでの揮発性指定子の使用

分類Dev

Javaでの揮発性キーワードの使用

分類Dev

System.out.println()とJavaのreturnの違い

分類Dev

JavaのtoString-System.out.printlnとAndroidのログイン

分類Dev

Javaでsystem.out.printlnをどのように短縮しますか

分類Dev

JavaでSystem.out.printlnを使用する複数のスレッド

分類Dev

java(System.out.println)の結果でバッチ変数を設定する方法

分類Dev

Java揮発性配列?

Related 関連記事

ホットタグ

アーカイブ