答えて
HashMap
は同期されていないので、おそらく問題が発生します。私はデッドロックが特にあるかどうかはわかりません - 実装に依存すると思いますが、情報が不足する可能性があります。
一方、Hashtable
は同期されており、スレッドセーフである必要があります。
デッドロックは、2人のアクターがロックしてお互いのリソースを待っているときです。
もちろん、HashMapを使用するとデッドロックが発生することがあります。しかし、デッドロックは、HashMapを使用しているあなたのコードによって行われます。
コードを確認して、私は答えを頼む。
ハッシュマップ自体はロックを行いません。それにもかかわらず、複数のスレッドから同じマップを読み込んで変更する正しいコードでは、ロックを使用する必要があります。ロックが画像に入ると、デッドロックが発生する可能性があります。
ロックがいくつあるのか、どのように使用されているのかわからないと、デッドロックが可能かどうかを確かめることはできません。
デッドロックは、複数のロックを使用し、正しい順序でロック/ロック解除しない場合にのみ発生します。 HashMap
を1つの(正しく使用されている)ロック(またはまったく使用しない)だけで保護している場合、デッドロックは発生しません。
標準HashMap
は、それ自体が保護されていないので、(あなたが投稿していない)ロックコードだけがデッドロックを引き起こす可能性があることに注意してください。
デッドロックか無限ループかは本当ですか?マルチスレッド化された環境で非同期化されたHashMap
を使用すると、複数の変更が内部的に破損したハッシュマップ構造を作成する可能性があります。これを避けるにはCollections.synchronizedMap()
を使用してください。
HashMap
はスレッドセーフではありません。 HashMap
をスレッドセーフにするには、Collections.synchronizedMap()
メソッドを使用します。
HashMap<K, V> map = Collections.synchronizedMap(new HashMap<K, V>());
HashMap
はスレッドセーフではなく、ロックも行いません。だから、あなたはデッドロックを得ることはできませんが、あなたが望むものが得られないかもしれません。結局のところ、無限ループに終わる可能性がありますが、おそらくテストでそれを検出することはありません。
java.util.concurrent.ConcurrentHashMap
はスレッドセーフであり、優れたパフォーマンスを発揮します。しかし、マルチスレッド化にはさらに多くのことがあります。
私の親指のルール: 'ConcurrentMap'は通常の' Map'(つまりput/get/removeのみ)と同じように、何か間違っている必要があります。 – bestsss
未装飾のHashMap
を使用してデッドロックすることはできません。 HashMap
クラスはロックを行わないため、デッドロックの機会はありません。
Collections.synchronizedMap(...)
を使用してHashMap
をラップし、これを他のロックと併用すると、異なるスレッドが異なる順序でオブジェクトのロックを取得した場合、デッドロックが発生する可能性があります。
明らかに、スレッドセーフではない同じHashMap
にアクセスする複数のスレッドは危険です。実際には、のスレッドが、無限ループになるようにHashMap
の矛盾した状態を見ることが可能である可能性があります。例えばハッシュチェーンの1つに見かけのサイクルでスタックしています。これは起こりそうもないようですが、複数のスレッドが同期せずにデータ構造に当たることによって引き起こされるメモリの異常を考慮して、コードの徹底的な分析を行う必要はありませんでした。
HashMap
は、同時に変更されたときに無限ループになると見ています。デッドロック(またはライブロック)とは関係ありませんが、破損したデータ構造をトラバースすることによって発生します。
これは、ツリーを横断するコード自体が壊れた参照から保護されないため、バケットがTreeNodeに変換されたときに特に発生します。
通常は、putTreeVal
または類似の場所にスレッドがスタックされているスタックトレースが表示されます。
- 1. デッドロックの作成
- 2. デッドロックを作成するプロセスは何ですか?
- 3. HashMapのキューを作成することは可能ですか?
- 4. HashMap putまたはputAll? - Java
- 5. Java Hashmapのタイピングシステムとは何ですか?
- 6. Java 8のLambda、フィルターHashMapはメソッドを解決できません
- 7. java VirtualMachine.getSystemProperties()デッドロック
- 8. Javaでアンドロイドで簡単にスレッドを作成できますか?
- 9. JavaでHashMapの代わりにJSONObjectを使用できますか?
- 10. C/C++のみからJavaクラスを作成できますか?
- 11. @SuppressWarningsを拡張するJavaアノテーションを作成できますか?
- 12. JavaでHashMapからオブジェクトを取得していますか?
- 13. Java:一般的なHashMapマージメソッドを作成する正しい方法は何ですか?
- 14. ABCLでJavaクラスを作成できますか?
- 15. public static abstract classをjavaで作成できますか?
- 16. C++プログラムで.javaファイルを作成できますか?
- 17. ページ固有のアンカータグをdocusign(Java)で作成できますか?
- 18. Javaでカスタム演算子を作成できますか?
- 19. Javaでポップアップエラーアラートを作成できますか?
- 20. Java XStream with HashMap
- 21. JavaからC#:HashMap、Map、Queue
- 22. Javaでは、Classオブジェクトから匿名サブクラスのインスタンスを作成できますか?
- 23. カスタムjava。*パッケージを作成できますか?
- 24. がデッドロックしますか?
- 25. Javaでenumの動的プロキシを作成することはできますか?
- 26. JavaでBufferedWriterの配列を作成することはできますか?
- 27. Hashmapはランダムアクセスを使用しますか?
- 28. Java 8 | HashMapのパラレルストリームのJava 8で
- 29. Javaイテレーション:HashtableとHashMap
- 30. Javaを使用してDLLを作成することはできますか?
彼はスレッドセーフではなくデッドロックについて尋ねました。 – Tudor
先史時代の 'ハッシュテーブル' – adarshr
イエップ、例えば 'ConcurrentHashMap'に代わるものがあります。 –