2016-10-03 4 views
-1

この素晴らしいページの質問と回答を2年以上使用した後、私はコミュニティに参加することに決めました!私の質問に今Readonlyオブジェクトとマルチスレッド

私は先日友人との議論を持っていた:私たちは考えて、読み取り専用であるかだけのスレッドによって読み取られる変数を確実にするために、ロックや他の何かを必要としないこと正しい値が読み取られます。しかし、arraylists、ハッシュマップのような他のオブジェクトとは何ですか?私は確かに、複数のスレッドが一度に問題のないオブジェクトの値を使用できることを知っていますか?

私が間違ったやり方を尋ねたり、私の思考過程で明白な何かを見逃してしまえば(まだ原子性について考えています...)、あまりにも厳しくはありません。 Map/Listの建設は、スレッドセーフであるとArrayListまたはHashMapが建設後に変更されていない場合は、[はい、あなたのスレッドがデータを読み取ることができますなら、私はどんな答え:)

+0

このような変数はfinalと宣言し、スレッドセーフです。 – olsli

答えて

0

のための感謝しています正しく新しいデータが追加された場合、または既存のデータが変更された場合、適切な同期が取られていないと、新しい変更が他のスレッドに見えるという保証はありません。

0

カスタム共有データ/オブジェクトは、変更不可能/書き込み可能 - 1回/読み取り専用 - 構築後タイプが必要です。

または

コレクションの種類を同期する必要があります。 JSR 166でリリースされたjava.util.concurrentパッケージのコレクション型を使用するか、java.util.Collections.synchronizedCollection(Collection obj)関数を使用してコレクションを同期させることができます。

同時スレッドのコレクションは、マルチスレッド操作のsynchronizedCollectionと比較してはるかに高速で最適化されていることに留意してください。

関連する問題