2011-12-22 32 views

答えて

0

HashMapは同期されていないので、おそらく問題が発生します。私はデッドロックが特にあるかどうかはわかりません - 実装に依存すると思いますが、情報が不足する可能性があります。

一方、Hashtableは同期されており、スレッドセーフである必要があります。

+0

彼はスレッドセーフではなくデッドロックについて尋ねました。 – Tudor

+0

先史時代の 'ハッシュテーブル' – adarshr

+0

イエップ、例えば 'ConcurrentHashMap'に代わるものがあります。 –

1

デッドロックは、2人のアクターがロックしてお互いのリソースを待っているときです。

もちろん、HashMapを使用するとデッドロックが発生することがあります。しかし、デッドロックは、HashMapを使用しているあなたのコードによって行われます。

コードを確認して、私は答えを頼む。

2

ハッシュマップ自体はロックを行いません。それにもかかわらず、複数のスレッドから同じマップを読み込んで変更する正しいコードでは、ロックを使用する必要があります。ロックが画像に入ると、デッドロックが発生する可能性があります。

ロックがいくつあるのか、どのように使用されているのかわからないと、デッドロックが可能かどうかを確かめることはできません。

4

デッドロックは、複数のロックを使用し、正しい順序でロック/ロック解除しない場合にのみ発生します。 HashMapを1つの(正しく使用されている)ロック(またはまったく使用しない)だけで保護している場合、デッドロックは発生しません。

標準HashMapは、それ自体が保護されていないので、(あなたが投稿していない)ロックコードだけがデッドロックを引き起こす可能性があることに注意してください。

-1

デッドロックか無限ループかは本当ですか?マルチスレッド化された環境で非同期化されたHashMapを使用すると、複数の変更が内部的に破損したハッシュマップ構造を作成する可能性があります。これを避けるにはCollections.synchronizedMap()を使用してください。

-1

HashMapはスレッドセーフではありません。 HashMapをスレッドセーフにするには、Collections.synchronizedMap()メソッドを使用します。

HashMap<K, V> map = Collections.synchronizedMap(new HashMap<K, V>()); 
1

HashMapはスレッドセーフではなく、ロックも行いません。だから、あなたはデッドロックを得ることはできませんが、あなたが望むものが得られないかもしれません。結局のところ、無限ループに終わる可能性がありますが、おそらくテストでそれを検出することはありません。

java.util.concurrent.ConcurrentHashMapはスレッドセーフであり、優れたパフォーマンスを発揮します。しかし、マルチスレッド化にはさらに多くのことがあります。

+0

私の親指のルール: 'ConcurrentMap'は通常の' Map'(つまりput/get/removeのみ)と同じように、何か間違っている必要があります。 – bestsss

1

未装飾のHashMapを使用してデッドロックすることはできません。 HashMapクラスはロックを行わないため、デッドロックの機会はありません。

Collections.synchronizedMap(...)を使用してHashMapをラップし、これを他のロックと併用すると、異なるスレッドが異なる順序でオブジェクトのロックを取得した場合、デッドロックが発生する可能性があります。

明らかに、スレッドセーフではない同じHashMapにアクセスする複数のスレッドは危険です。実際には、のスレッドが、無限ループになるようにHashMapの矛盾した状態を見ることが可能である可能性があります。例えばハッシュチェーンの1つに見かけのサイクルでスタックしています。これは起こりそうもないようですが、複数のスレッドが同期せずにデータ構造に当たることによって引き起こされるメモリの異常を考慮して、コードの徹底的な分析を行う必要はありませんでした。

1

HashMapは、同時に変更されたときに無限ループになると見ています。デッドロック(またはライブロック)とは関係ありませんが、破損したデータ構造をトラバースすることによって発生します。

これは、ツリーを横断するコード自体が壊れた参照から保護されないため、バケットがTreeNodeに変換されたときに特に発生します。

通常は、putTreeValまたは類似の場所にスレッドがスタックされているスタックトレースが表示されます。

関連する問題