2

私は Java の世界の初心者であり、並行ハッシュ マップを探索しています。並行ハッシュ マップ API を探索しているときに、putifAbsent() メソッドを発見しました。

public V putIfAbsent(K paramK, V paramV)
  {
    if (paramV == null)
      throw new NullPointerException();
    int i = hash(paramK.hashCode());
    return segmentFor(i).put(paramK, i, paramV, true);
  }

次に、それがどのような機能であり、いつ実際に必要になるかをアドバイスしてください。可能であれば、簡単な例で説明してください。

4

3 に答える 3

0

遅延初期化された名前付きシングルトン Bean のキャッシュが必要だと想像してください。以下は、ConcurrentHashMap ベースのロックフリー実装です。

ConcurrentMap<String, Object> map = new ConcurrentHashMap<>();

<T> T getBean(String name, Class<T> cls) throws Exception {
    T b1 = (T) map.get(name);
    if (b1 != null) {
        return b1;
    }
    b1 = cls.newInstance();
    T b2 = (T) map.putIfAbsent(name, b1);
    if (b2 != null) {
        return b2;
    }
    return b1;
}

ダブルチェック ロックと同じ問題を解決しますが、ロックを使用しないことに注意してください。

于 2013-04-06T13:01:54.423 に答える