私はどちらもスレッドセーフな方法があることを知っています。スレッドセーフであることを知りたいですか?実装は何ですか?これはすべてのインタビューでよくある質問です。VectorとHashtableはコレクションのスレッドセーフですか?
答えて
これらはありません。すべてののメソッドは、と同期しています。それは同じものではありません。反復を囲むブロックがスレッドセーフでない限り、それらの反復はスレッドセーフではなく、スレッドセーフでもありません。同期。したがって、呼び出し元はスレッドセーフを提供する責任があります。これは、Collections Frameworkの新しいクラスがデフォルトで同期メソッドを持たなかった理由です。
私は、新しいコレクションクラスが同期化されなかった理由は、同期に*重要な*パフォーマンス上のペナルティがあり、ほとんどのデータ構造がマルチスレッドの状況で使用されていないためだと考えました。私は、これらのクラスによって提供されるシンプルな同期パターンが不十分な多くの状況があることに同意しますが、スレッドセーフではないと言っても過ぎてしまうと思います。 –
私は@EJPが批判的に区別されていると主張します。名目上スレッドセーフなクラスを使用しても、自動的に正しい同期が行われるわけではありません(http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html)。 – trashgod
@trashgod - "正しい同期"(それが何であれ)が必ずしも正しい同期を与えるわけではありません。 VectorとHashtableは多くの(多分すべての)状況で十分な同期を提供しますが、いつものように考えが必要です。 –
6何かある日/オラクルJDKの私のバージョンに同梱Vectorクラスは、そう
public synchronized void insertElementAt(E obj, int index) {
modCount++;
if (index > elementCount) {
throw new ArrayIndexOutOfBoundsException(index
+ " > " + elementCount);
}
ensureCapacityHelper(elementCount + 1);
System.arraycopy(elementData, index, elementData, index + 1, elementCount - index);
elementData[index] = obj;
elementCount++;
}
すべての重要な方法は右に、このように同期されているように、同期メソッドを使用していますメソッドシグネチャ
ただし、これは義務ではありません。契約では、スレッドを安全にしなければならないとしか書かれていません。
これらのクラスは条件付きでスレッドセーフであり、それらを使用するのは良いスタイルではありません。より良いオプションは、本当にスレッドセーフであり、良好なパフォーマンスを提供するjava.util.concurrent。*クラス(ConcurrentHashMap、CopyOnWriteArrayListなど)を使用することです。
ConcurrentHashMapのが同期HashMapのよりもはるかに優れたスケール:http://www.javamex.com/tutorials/concurrenthashmap_scalability.shtml
をこれら二つのクラスの問題は、同期方法を提供することにより、スレッドセーフであることの印象を与えるが、その内部の状態は、彼らはあなたがへのアクセスを提供イテレータによって変更可能であるということです。
これでの同期化は、すべての同期メソッドで同じ同期ロックを共有するため、スレッドの排他性を購入するだけです。
これは、クラス内のメソッドがスレッドセーフであることを示す用語です。
- 1. スカラ不変なコレクションはスレッドセーフですか?
- 2. チェーンされたスレッドセーフなコレクションはスレッドセーフですか?
- 3. std :: vector要素への代入はスレッドセーフですか?
- 4. C99のHashTableとVectorのようなデータ構造
- 5. - スレッドセーフなコレクション修正
- 6. このシナリオでは、どのスレッドセーフなコレクションが適切ですか?
- 7. System.Collections.Concurrentコレクションの拡張メソッドはスレッドセーフですか?
- 8. ScalaでAkkaアクターのスレッドセーフなコレクション
- 9. VectorとHashTableはなぜ非推奨になると広く考えられていますか?
- 10. mongo_c_driverの異なるコレクションのスレッドセーフ
- 11. fastutilsでスレッドセーフで不変なコレクションを実現するには?
- 12. Scalaコレクションをスレッドセーフに更新する
- 13. 静的コレクションへのスレッドセーフなアクセス
- 14. スレッドセーフな列挙、Cでのコレクションの追加または削除#
- 15. javaスレッドセーフ:スレッドセーフですか?
- 16. SpringのTransactionTemplateとSimpleJdbcTemplateはスレッドセーフですか?
- 17. スレッドセーフstd :: atomic <vector<int>>を作成できますか?
- 18. スレッドセーフではないコレクションを変更する
- 19. HashTableと配列
- 20. lockキーワードとスレッドセーフなコレクションを使用する場合
- 21. グローバルレベルでmongoDBコレクションを定義する理由 - スレッドセーフです
- 22. ContainerRequestFilterとContainerResponseFilterはスレッドセーフですか?
- 23. スレッドセーフなByteArrayOutputStreamとは何ですか?
- 24. IMAPStoreとIMAPFolderはJavaMailスレッドセーフですか?
- 25. C#のArrayListとHashtableの違いは何ですか?
- 26. HashTable/HashMapは配列ですか?
- 27. .Net HashtableとJava HashtableとHashMapの相違点
- 28. strcmpではスレッドセーフですか?
- 29. はPythonスレッドセーフで+ =ですか?
- 30. HashTableをソートすることはできますか?
'HashTable'の代わりに' CuncurrentHashMap'を使用してください –
mutexのような同期プリミティブは、相互排除のために使用されます。 –
@ルーギー、私はあなたがポイントを見逃していると思います。 OPは(まだすべてのメソッドが同期されているので) 'Hashtable'がスレッドセーフである理由を質問しています。 –