並行処理対応のConcurrentHashMapの使い方

2009/02/20 14:40Update
TAGS: スレッドセーフ | 並行 | アトミック | 原子 | ConcurrentHashMap | synchronized

ConcurrentHashMapはJDK 1.5からjava.util.concurrentパッケージで提供された並行性をサポートするスレッド・セーフなMapです。

ConcurrentHashMapはロックの粒度を小さくすることで、従来のsynchronizedやsynchronizedMapより性能がよいと言われます。

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「英語」

有关作者
Syboos.jp編集長AJavaやオープンソース情報の執筆、Webサイトの開発や運営全般の業務に携わる。

Sponsored Link


Comments

用户名 (required)

Email (will not be published) (required)

URL

Evaluation

  • Relative Articles