私はHashMap
,HashSet
、HashTable
の違いについて読んできました。私が気づいている重要なことは、HashTable
の間にHashMap
/HashSet
が同期していないことがわかったということです。私はこのようなブロックが使用されているいくつかの場所がある前に見てきたコードベースでしかし (Java)同期されていない場合、HashSetを同期して使用することが許可されるのはなぜですか?
synchronized (hashSet) {
//Some code involving the hashset
}
どうHashSet
が同期していない場合、これは可能ですか?同期化されたブロックは、同期化されているかのように非同期データ構造を使用することができますか?
HashSet
が同期していれば、synchronized(){}ブロックを含める必要はありませんか?
'synchronized'は、何らかのオブジェクトへの参照を必要とするだけで、そこからモニタを取得します。そのオブジェクトが何であるかは問題ではありません。 –
はい、同期ブロックを一貫して使用すると、同期されていないオブジェクトを同期させたものとして使用できます。 – user949300
任意のオブジェクトに対して 'synchronized(object)'を使うことができることを理解することは重要ですが、同じオブジェクトに対して 'synchronized' *を使ってすべてのスレッドに影響を与えます*。異なるオブジェクトで同期しているスレッドや 'synchronized'を使用していないスレッドは影響を受けません。したがって、これらのスレッドが' HashSet'にアクセスすると、アプリケーションは依然として壊れています。同期技術*を一貫して使用している場合は、あらゆるデータ構造のスレッドに安全にアクセスできます*。 – Holger