3

ThreadSafeとはどういう意味ですか?

以下は私の理解です:

私には似ています。複数のスレッドが同時にコレクションにアクセスできるようにする。これは同期とは関係ありません。たとえば、同期キーワードのないメソッド。スレッドセーフです。つまり、複数のスレッドがアクセスできます。

マルチスレッドがアクセスしている間にデータの整合性を維持するために、このメソッドでさらにロジック (同期) を維持するかどうかは、開発者の選択次第です。それはスレッドセーフとは別のものです。

私の上記の声明が間違っている場合; 以下の「ConcurrentHashMap」の Java DOC を読んでください。

keySet: ビューのイテレータは、ConcurrentModificationException を決してスローしない「弱い一貫性のある」イテレータであり、イテレータの構築時に存在していた要素をトラバースすることを保証し、構築後の変更を反映する可能性があります (ただし保証はされません)。

上記のステートメントは、keySet イテレーターがデータの整合性を保証しないことを示しています。マルチスレッドがコレクションを変更している間。

答えていただけますか、* ConcurrentHashMap の KeySet イテレータはスレッドセーフですか?

そして、スレッドセーフに関する私の理解は正しいですか??

4

3 に答える 3

3

keySet: ビューのイテレータは、ConcurrentModificationException を決してスローしない「弱い一貫性のある」イテレータであり、イテレータの構築時に存在していた要素をトラバースすることを保証し、構築後の変更を反映する可能性があります (ただし保証はされません)。

これ自体が、ConcurrentHashMap の KeySet イテレーターがスレッドセーフであることを説明しています。

于 2013-10-25T08:25:13.317 に答える
3

パッケージの背後にある一般的な考え方java.util.concurrentは、強力な一貫性を持たないスレッドセーフなアクセスを提供する一連のデータ構造を提供することです。このようにして、これらのオブジェクトは、適切にロックされたオブジェクトよりも高い同時実行性を実現します。

スレッド セーフであるということは、明示的な同期がなくても、オブジェクトが破損することはないということです。HashTableおよび一部のメソッドは、最初に要素が存在することを確認してから削除するメソッドHashMapなど、マルチスレッド アクセスで問題になる可能性があります。removeこれらの種類のメソッドは、ConcurrentHashMapではアトミック操作として実装されるため、一部のデータが失われることを恐れる必要はありません。

ただし、このクラスが操作ごとに自動的にロックされるわけではありません。putAllやイテレータなどの高レベルの操作は同期されません。このクラスは強整合性を提供しません。操作の順序とタイミングは、オブジェクトを破損しないことが保証されていますが、正確な結果が生成されることは保証されていません。

たとえば、 への呼び出しと同時にオブジェクトをputAll出力すると、部分的に入力された出力が表示される場合があります。新しい挿入と同時にイテレータを使用すると、引用したすべての挿入が反映されない場合があります。

これは、スレッドセーフであることとは異なります。結果に驚かれるかもしれませんが、何も失われたり、誤って上書きされたりすることはなく、要素が問題なくオブジェクトに追加および削除されます。この動作で要件が十分に満たされる場合は、java.util.concurrentクラスを使用することをお勧めします。より一貫性が必要な場合は、同期されたクラスを使用するjava.utilか、同期を自分で使用する必要があります。

于 2013-10-25T08:32:27.877 に答える