#JCIPからの引用:
「ConcurrentHashMap は排他的アクセスのためにロックできないため、Vector で行ったように、クライアント側のロックを使用して、put-if-absent などの新しいアトミック操作を作成することはできません」
追加のアトミックメソッドを実装し、コレクションをスレッド セーフに保つためにロックを取得できない理由( Collections.synchronizedxxxファクトリによって返される同期コレクションなど) :
#JCIPからの引用:
「ConcurrentHashMap は排他的アクセスのためにロックできないため、Vector で行ったように、クライアント側のロックを使用して、put-if-absent などの新しいアトミック操作を作成することはできません」
追加のアトミックメソッドを実装し、コレクションをスレッド セーフに保つためにロックを取得できない理由( Collections.synchronizedxxxファクトリによって返される同期コレクションなど) :
ConcurrentHashMap の要点は、読み取り操作がブロックされないことです。つまり、ロックをチェックする必要はありません。これにより、そのようなロックを持つことができなくなります。
ロックを取得できない理由:
それを行うこともできますが、マップへのすべてのアクセスパスに対して一貫して行う必要があり、並行データ構造の目的を完全に否定しています。ロックフリーのはずです。
なんで?実装がサポートしていないためです。JavaDocs からConcurrentHashMap
直接:
すべてのアクセスを防ぐ方法でテーブル全体をロックすることはサポートされていません
...これは、定義上、「排他的アクセス」です。
あなたが書いたコードはあなたの実装であり、それをそのように使用する場合、他のすべての操作はそのように機能する必要があります。つまり、すべての操作は同じロックを取得する必要があります。
ただし、ここでの主なポイントは、Java がConcurrentHashMap
この目的のために提供していないということです。その目的は、複数のスレッドが同時に動作できるようにすることです。
あなたの要件のために行きますHashTable
。