2012-04-04 10 views
3

私はどちらもスレッドセーフな方法があることを知っています。スレッドセーフであることを知りたいですか?実装は何ですか?これはすべてのインタビューでよくある質問です。VectorとHashtableはコレクションのスレッドセーフですか?

+0

'HashTable'の代わりに' CuncurrentHashMap'を使用してください –

+0

mutexのような同期プリミティブは、相互排除のために使用されます。 –

+1

@ルーギー、私はあなたがポイントを見逃していると思います。 OPは(まだすべてのメソッドが同期されているので) 'Hashtable'がスレッドセーフである理由を質問しています。 –

答えて

1

OpenJDKVectorHashtableのコード内部を見てみましょう、あなたはpublicメソッドのほとんどは​​していることに気づくでしょう、それは方法スレッドセーフ両方のコレクションのを行い、実装の詳細です。また、これらのコレクション(反復など)に対する他の操作では、スレッドセーフであるために外部同期が必要であることにも注意してください。

1

これらはありません。すべてののメソッドは、と同期しています。それは同じものではありません。反復を囲むブロックがスレッドセーフでない限り、それらの反復はスレッドセーフではなく、スレッドセーフでもありません。同期。したがって、呼び出し元はスレッドセーフを提供する責任があります。これは、Collections Frameworkの新しいクラスがデフォルトで同期メソッドを持たなかった理由です。

+1

私は、新しいコレクションクラスが同期化されなかった理由は、同期に*重要な*パフォーマンス上のペナルティがあり、ほとんどのデータ構造がマルチスレッドの状況で使用されていないためだと考えました。私は、これらのクラスによって提供されるシンプルな同期パターンが不十分な多くの状況があることに同意しますが、スレッドセーフではないと言っても過ぎてしまうと思います。 –

+1

私は@EJPが批判的に区別されていると主張します。名目上スレッドセーフなクラスを使用しても、自動的に正しい同期が行われるわけではありません(http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html)。 – trashgod

+0

@trashgod - "正しい同期"(それが何であれ)が必ずしも正しい同期を与えるわけではありません。 VectorとHashtableは多くの(多分すべての)状況で十分な同期を提供しますが、いつものように考えが必要です。 –

0

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++; 
} 

すべての重要な方法は右に、このように同期されているように、同期メソッドを使用していますメソッドシグネチャ

ただし、これは義務ではありません。契約では、スレッドを安全にしなければならないとしか書かれていません。

+0

契約では、「新しいコレクションの実装とは異なり、Vectorは同期されています。 – EJP

+0

あなたが望むならば、まさにスレッドセーフが意味することについて毛髪を分けることができます。 – corsiKa

+0

私はあなたの最終的な文章を参照しています。この契約では、メソッドが同期されていることが指定されていますが、*糸の安全性は指定されていません。これは国のマイルでは同じではありません。 – EJP

0

これらのクラスは条件付きでスレッドセーフであり、それらを使用するのは良いスタイルではありません。より良いオプションは、本当にスレッドセーフであり、良好なパフォーマンスを提供するjava.util.concurrent。*クラス(ConcurrentHashMap、CopyOnWriteArrayListなど)を使用することです。

ConcurrentHashMapのが同期HashMapのよりもはるかに優れたスケール:http://www.javamex.com/tutorials/concurrenthashmap_scalability.shtml

0

をこれら二つのクラスの問題は、同期方法を提供することにより、スレッドセーフであることの印象を与えるが、その内部の状態は、彼らはあなたがへのアクセスを提供イテレータによって変更可能であるということです。

これでの同期化は、すべての同期メソッドで同じ同期ロックを共有するため、スレッドの排他性を購入するだけです。

0

これは、クラス内のメソッドがスレッドセーフであることを示す用語です。

関連する問題