1

これらの概念を正しく理解していることを確認したいと思います。説明/確認は私を大いに助けてくれますし、他の多くのプログラマーも確信しています。したがって、これらの概念についての私の理解は、私の調査から得られたものです。

  1. Volatile は、複数のスレッド間で変数を共有する場合に使用されます。a) (スレッド間で共有される) 変数を volatile と宣言しないことの違いは何ですか? b) 異なるスレッドからアクセスしている場合、常に volatile と宣言する必要がありますか? c) volatile 変数を同期することは理にかなっていますか?

  2. AtomicReference は、オブジェクトをラップし、いくつかのアトミック操作 (compareAndSet、lazySet、weakCompareAndSet) を提供するクラスです。これですべてです。同期も何もありません。a) AtomicReference volatile を宣言するのは理にかなっていますか? b) AtomicReference.get は同期もセットもされていないため、同期しますか?

  3. 同期は、複数のスレッド間で共有される変数への順次アクセスを意味する概念です。インスタンスごと、クラスごとに行うことができます。同期は、メソッド ヘッダーまたはコード ブロックに追加できます。ここにミステリーはありません:)

よろしく、アウレリアン

4

2 に答える 2

2

a) (スレッド間で共有される) 変数 volatile を宣言する場合と宣言しない場合の違いは何ですか?

揮発性でない場合、あるスレッドによる書き込みが他のスレッドから認識されない可能性があります。

b) 異なるスレッドからアクセスしている場合、常に volatile と宣言する必要がありますか?

常に同期ブロックからアクセスされている場合を除きます。

c) volatile 変数を同期することは理にかなっていますか?

ただし、volatile 変数が同期ブロックの外部でもアクセスされる場合に限ります。

a) AtomicReference volatile を宣言するのは理にかなっていますか?

実行時にインスタンスを変更する予定がある場合は、間違いなくそうです。ただし、通常はfinal AtomicReference.

b) AtomicReference.get は同期もセットもされていないため、同期しますか?

AtomicReference アクセスを同期すると、ロックフリー マルチスレッドの目的そのものが無効になります。同期または AtomicReference のいずれかを選択します。

于 2013-08-25T11:43:53.727 に答える
2

Volatile は、複数のスレッド間で変数を共有する場合に使用されます。a) (スレッド間で共有される) 変数を volatile と宣言しないことの違いは何ですか? b) 異なるスレッドからアクセスしている場合、常に volatile と宣言する必要がありますか? c) volatile 変数を同期することは理にかなっていますか?

を理解するvolatileには、最新のコンピュータ システム ハードウェアのアーキテクチャについて考えると役に立ちます。

パフォーマンスを加速するために、各プロセッサまたはコアには独自のローカル メモリ キャッシュがあります。このキャッシュに存在するデータは、特定のプロセッサに対してローカルであり、他のプロセッサからは見えません。さらに、JVM 自体を含め、ほぼすべてのレベルにデータ キャッシュが存在する可能性があります。

このようにスレッド、つまりプロセッサ間で分割できる実行単位を考えると、Java メモリ モデルの非常に重要な事実を理解するのは簡単です。

1 つのスレッドで行われた共有変数への変更が、同じ変数に (同期なしで) アクセスする他のスレッドから見えるようになるという保証はありません。

ここでも、共有変数を更新したデータがまだローカル プロセッサ キャッシュにあると想像してください。このキャッシュは、他のコアからは利用できません (したがって、それらのコアで実行されている他のスレッドからは利用できません)。

このvolatileキーワードは、共有変数への変更がすぐにメモリに書き出されることを保証する方法を提供し、共有変数に発生した変更が他のスレッドから見えるようにします。 Volatile単純な状況では便利で、データの有効性が向上しますが、原子性が保証されないため、共有変数で競合状態が発生しないという保証はありません。

ある論理状態から別の論理状態へのオブジェクトの変更に複数の手順が必要な場合は、状態遷移に宣言された変数のみが含まれる場合でもvolatile、オブジェクトの状態へのアクセスを同期して原子性を維持する必要があります (更新が完全に行われるか、まったく行われないかのいずれか) 。

于 2013-08-25T12:18:23.223 に答える