2017-11-29 31 views
4

私はHashMap,HashSetHashTableの違いについて読んできました。私が気づいている重要なことは、HashTableの間にHashMap/HashSetが同期していないことがわかったということです。私はこのようなブロックが使用されているいくつかの場所がある前に見てきたコードベースでしかし (Java)同期されていない場合、HashSetを同期して使用することが許可されるのはなぜですか?

synchronized (hashSet) { 
    //Some code involving the hashset 
} 

どうHashSetが同期していない場合、これは可能ですか?同期化されたブロックは、同期化されているかのように非同期データ構造を使用することができますか?

HashSetが同期していれば、synchronized(){}ブロックを含める必要はありませんか?

+4

'synchronized'は、何らかのオブジェクトへの参照を必要とするだけで、そこからモニタを取得します。そのオブジェクトが何であるかは問題ではありません。 –

+3

はい、同期ブロックを一貫して使用すると、同期されていないオブジェクトを同期させたものとして使用できます。 – user949300

+2

任意のオブジェクトに対して 'synchronized(object)'を使うことができることを理解することは重要ですが、同じオブジェクトに対して 'synchronized' *を使ってすべてのスレッドに影響を与えます*。異なるオブジェクトで同期しているスレッドや 'synchronized'を使用していないスレッドは影響を受けません。したがって、これらのスレッドが' HashSet'にアクセスすると、アプリケーションは依然として壊れています。同期技術*を一貫して使用している場合は、あらゆるデータ構造のスレッドに安全にアクセスできます*。 – Holger

答えて

5

​​ブロックには、同期するためのオブジェクトが必要です。 HashSetが非同期であると言われている場合は、メソッド自体が同期されていないことを意味し、マルチスレッドのコンテキストで使用する場合は、自分で同期を処理する必要があります(例えば、synchronizingあなたのスニペットに示されているようにHashSetオブジェクト)。

+0

同期されたデータ構造を使用することの意義は何ですか? HashTableを使用した場合(同期されているので)、同期ブロックを使用しないで同期ブロックと同じことを実行できますか? –

+1

もちろん他のオブジェクトと同様に、 'Hashtable'に' synchronize'することもできます。しかし、同期されたデータ構造を使用することによって保証されるのは、基本的な操作( 'put'や' get'のような)がマルチスレッドコンテキストで壊れないことだけです。より高次のロジックが適切に機能するようにするには、同期方法を自分で使う必要があります。 – Mureinik

関連する問題