2016-09-21 10 views
0

私はスレッドを保持しています(ConcurrentHashMapのの値の追加、削除、変更)。新しいスレッドは、共有オブジェクトに対する他のすべてのスレッドの以前のアクションの完全なメモリ可視性を持っていますか?

私はソケットに耳を傾け、時折新しいクライアント接続を処理するためにスレッドCを作成するスレッドBを持っています。

すべてのスレッドCのは今までのスレッドによって維持のConcurrentHashMap(それを更新したことがない)から読み込まれます。

はスレッドBによって開始/スレッドC作成される前に、CConcurrentHashMapの上スレッドによって実行されたすべての更新を、見ることが保証スレッドですか?

(質問より明確にするために最後の文を編集:。ConcurrentHashMapの最新情報についてのみ関心を)

+0

はい、Java Memory Model *(q.v。)*の発生前の条項に従います。基本的には、すべてのアクセスが 'synchronized'または' java.util.concurrent'に相当するものであることを確認する必要があります。 – EJP

答えて

1

スレッドCは、スレッドCがスレッドBによって作成/開始される前にスレッドAによって実行されたすべての更新を確認することが保証されていますか? (通常HashMapと例えば、)一般的に

しかし、スレッドCがスレッドAにより作成された場合(再び一般に)、次いで、答えはイエスであろう。

が起こる-前に1スレッドオブジェクトにstart()を呼び出したスレッド、新しいスレッドのrun()メソッドの開始との間に関係があります。しかし、あなたは第三のスレッドを導入している...と何も説明していないことが起こる前に AからBへの連鎖。)


しかし、あなたはここでConcurrentHashMapについて話している、との同時マップは先天性のメモリ一貫性があります。

「メモリー整合性効果を:配置する前に他の同時コレクションは、スレッド内のアクションと同じように他のスレッドのConcurrentMapからそのオブジェクトのアクセスまたは削除に続くアクションの前に、キーまたは値としてConcurrentMapのオブジェクトが発生します。 (ConcurrentMapjavadocから。)

ので、複数のスレッドが読み取り専用のスレッドが別の1で行われた更新を確認することが保証されてConcurrentHashMapを共有している何のために...の文書化行動を法イテレータ。

+0

この包括的な回答をいただきありがとうございます。私の質問はうまくいきませんでした。私は、更新が可視かどうかを尋ねるのではなく、スレッドCがConcurrentHashMapから読み取るだけであると言いました。 – RonR

+0

私はすでにそうであると想定していました。 –

1

をはい、docsに述べたように:

回収のが最も最近完了更新 の結果を反映彼らの発症時に保持する操作。 (詳細は、正式に、指定されたキーの更新 動作が更新された値を報告し、そのキーのための任意の (非ヌル)検索で発生-前関係を負う。)

1

はい、ConcurrentHashMapオブジェクトが共有されている場合グローバルに渡されるか、thread Cに渡されます。

1

あなたのフレーズ

スレッドCが作成される前に、スレッドAが実行する/スレッドBによって開始されましたか?

は、Javaメモリモデルが時間の順序付けに基づいて保証を提供しないため、あまり定義されていない概念を扱います。 が起こる前に、がプログラム注文または同期注文のどちらかで注文する必要があります。どちらもしていないようです。

質問に「間違った仮定」があるので、「いいえ」であなたの質問に答えるのは間違いでしょう。

1

私はこれに新しいです、私は何かを追加したい、Dariuszあなたは私たちは揮発性修飾語を使用することができます更新された値を考えないでください。

私が間違っていれば、揮発性変数が常に更新された値を返します。

関連する問題