私は最近、次の構造に出くわしました
Map<String,Value> map = new HashMap<>();
...
Value getValue(String key) {
synchronized (key.intern()) {
return map.remove(key);
}
}
intern()
通常はそれほど高速ではないことを考えると、これがsynchronized
, Collections.synchronizedMap(Map)
orを使用した場合よりも優れているとは思えませんConcurrentHashMap
。しかし、この特定のケースでは、この構造が他のすべての方法よりも高速であったとしても、これは適切に同期されていますか? ハッシュテーブルの再編成中に削除が発生する可能性があるため、これがスレッドセーフであるとは思えません。しかし、これがうまくいくとしても、HashMap javadocが次のように述べていることを考えると、コードが壊れているのではないかと思います。
複数のスレッドが同時にハッシュ マップにアクセスし、少なくとも 1 つのスレッドがマップを構造的に変更する場合は、外部で同期する必要があります。