をマルチスレッドでは、私はこの方法contains
はHashSetのオブジェクト上でスレッドセーフであるかどうかを知りたいHashSetのと
のJava 7で動作します。
HashSetは1つのスレッドで初期化されます。次に、変更不可能なコレクション(Collections.unmodifiableSet
)でHashSetをラップします。初期化後、複数のスレッドはメソッドcontains
のみを呼び出します。
私がJavadocを読むと、私にとっては不明です。
HashSet Javadocで私達は、このクラスは、ハッシュテーブル(実際にはHashMapのインスタンス)をSetインタフェースを実装
を読むことができます。この実装は同期化されていないことを
...
注意。
そしてHashMap Javadocに、我々は読むことができます:この実装は同期化されていないことを
注意を。複数のスレッドが同時にハッシュマップにアクセスし、少なくとも1つのスレッドがマップを構造的に変更する場合は、外部と同期させる必要があります。 (構造的修飾は、一つ以上のマッピングを追加または削除する操作であり、単にインスタンスが既に含まれていることをキーに関連付けられている値を変更することは構造的修飾ではない。)
私にとって、この手段メソッドcontains
は構造的な変更ではありません。方法contains
へ
だから、複数のコールは、スレッドセーフでありますか?
は、それは本当だ場合:それは(IBM JVMのような)JVMのすべての実装に保証されていますか?
あなたのスレッドが構造的な変更を加えていない場合、問題ではありません:いくつかの他のスレッドが構造的な変更を行っている場合、あなたは*すべてを同期する必要があります* 'contains'への呼び出しを含む*あらゆるスレッドからのアクセス。 –
HashSetの初期化時に 'Collections.unmodifiableSet'を使用しても、実際、私たちは私たちの場合に 'contains'メソッドだけを使うことを確信しています。 HashSetを使用するすべてのスレッド(初期化後)は、 'contains' – lecogiteur
というメソッドのみを使用して、他のスレッドが構造変更を行っているかどうかを確認します。構築時にunmodifiableSetですぐにセットをラップすると、他のスレッドは構造変更を行っていません。 –