0

HashMap にアクセスする必要がある 2 つのスレッドがあります。synchronizedキーワード andを使用しているのCollections.synchronizedMap()は、一度に 1 つのスレッドだけが使用できるようにするためです。

これらのスレッドの 1 つが決してスリープしないことが不可欠ですが、もう 1 つのスレッドはスリープできます。スリープできるスレッド、できないスレッド、またはその両方でsynchronizedandを使用する必要がありますか?Collections.synchronizedMap()

4

2 に答える 2

2

Threadこのシナリオで眠るのを防ぐことはできません。Thread優先度の低い がすでに にアクセスしている場合、Mapその操作を中断する方法はなく、待機する必要があります。
安全な同時アクセスを実現するには、両方でThreadsを使用するか、ラッパーsynchronizedを使用する必要があります。Collections.synchronizedMap()

于 2012-08-19T08:59:12.537 に答える
1

マップを保護するためだけに synchronized および Collections.synchronizedMap() を使用するのは冗長です。これらのアイテムの両方のユースケースは異なる可能性があるため、両方が「ツールボックス」に入っています.

マップ内の何かにアクセスする必要がある場合は、チェックしてから、1 つの操作として元に戻すことができます。同期を使用する必要があります。Map を取得して追加するだけの場合は、Collections.synchronizedMap() で十分です。

理論的には、「優先度の高い」スレッドによってアクセスされたときに「優先度の低い」スレッドに割り込もうとすることができますが、ハッシュ マップであるため、おそらく中止される可能性のある待機はあまり行われていません。

「優先度の高い」スレッドが行っていて、「優先度の低い」スレッドが行っていないことはありますか? マップのコピーを作成することは、常に読み取り可能なバージョンが存在するようにするために必要なことかもしれませんが、更新が遅くなる可能性があります。別の方向から問題に取り組むには、より多くの情報が必要になります。

技術的には、あなたの質問に対する簡単な答えはノーです。

于 2012-08-19T09:05:27.407 に答える