並行処理対応のConcurrentHashMapの使い方
2009/02/20 14:40Update
ConcurrentHashMapはJDK 1.5からjava.util.concurrentパッケージで提供された並行性をサポートするスレッド・セーフなMapです。
ConcurrentHashMapはロックの粒度を小さくすることで、従来のsynchronizedやsynchronizedMapより性能がよいと言われます。
ConcurrentHashMapを使ったマップへの追加には、アトミック(原子)なputIfAbsent()メソッドを使います。
このメソッドは、通常のput()メソッドと同様にConcurrentMap実装に追加するのですが、マップにキーが無い時にのみキーをマップに追加します。
使い方例:
例で示したように、ConcurrentHashMap内部では、アトミック操作を実現しており、外部によるロックする必要がありません。
putIfAbsentは以下のコードと等価します。
java.util.concurrent.ConcurrentHashMap API仕様
Javaの理論と実践: 優れたHashMapの構築
Javaの理論と実践: 並行コレクション・クラス
coding, by Derek Young: Correct use of ConcurrentHashMap
「英語」
ConcurrentHashMapを使ったマップへの追加には、アトミック(原子)なputIfAbsent()メソッドを使います。
このメソッドは、通常のput()メソッドと同様にConcurrentMap実装に追加するのですが、マップにキーが無い時にのみキーをマップに追加します。
使い方例:
ConcurrentHashMap map = new ConcurrentHashMap(); .. String key = ...; SomeClass obj = new SomeClass(); map.putIfAbsent(key, obj); ...
例で示したように、ConcurrentHashMap内部では、アトミック操作を実現しており、外部によるロックする必要がありません。
putIfAbsentは以下のコードと等価します。
if (!map.containsKey(key)) {
return map.put(key, obj);
} else {
return map.get(key);
}
参考資料
java.util.concurrent.ConcurrentHashMap API仕様
Javaの理論と実践: 優れたHashMapの構築
Javaの理論と実践: 並行コレクション・クラス
coding, by Derek Young: Correct use of ConcurrentHashMap
「英語」
Sponsored Link
Comments
- Relative Articles