3

イベント通知をサポートする同時実行マップを探しています。たとえば、そのようなキーで配置または削除時に呼び出される特定のキーのコールバックを登録できます。そして、全体がアトミックであるだけでなく、ConcurrentHashMap と同様に、かなりの程度の同時実行性も示しています。

私の最初の試みは、ConcurrentHashMap からセグメント ベースのソリューションを盗み出し、いくつかのイベント レジストリをセグメント クラスに追加することでした。しかし、これは予想以上に難しいことが判明しました。セグメント オフセットの計算はそれほど簡単ではないようです。ConcurrentHashMap からソリューションを盗むだけでは、それがどのように機能するかを理解していなければ、それほど簡単ではありません (詳細を見逃すと、バグが発生してしまいます)。ConcurrentHashMap のセグメント ソリューションがどのように機能するかを説明している論文を知っている人がいるでしょうか? 私がやり遂げることができたよりも。

リスナーの put または remove と呼び出しがすべて 1 つの同期ブロックで発生するように、マップの put または remove メソッドに大きな同期ブロックを配置するのは簡単です。しかし、これは最終的に同時実行性を低下させ、単一のセグメントを持つ ConcurrentHashMap のようなソリューションになります。

私が望むことを行うマップまたはイベントレジストリの実装を知っている人、または CONcurrentHashMap のこのセグメンテーションアルゴリズムがどのように機能するかを説明する論文へのリンクを知っている人を期待しています。

ありがとう、オリバー

4

1 に答える 1

0

最も簡単な解決策は、 への呼び出しをインターセプトして、ConcurrentHashMap登録したイベントから通知を受けることです。これを行う 1 つの方法は、次の例のように、ConcurrentHashMap をサブクラス化することです。

class ConcurrentHashMapWithEvent<K, V> extends ConcurrentHashMap<K, V> {
  ...
  @Override public V put(K key, V value) {
    System.out.println("This is right before put(" + k + ", " + v + ")");
    super.put(k, v);
    System.out.println("This is right after put(" + k + ", " + v + ")");
  }
  ...
  public void registerCallback(EventCondition cond, Callback callback) { ... }
}

の代わりに、 、 、マップの状態など、の一部と一致するかどうかを確認し、対応するコールバックを起動するprintlnロジックがあります。kvEventCondition

この種のパターン、つまりメソッド呼び出しをインターセプトして、前にコードを実行し、後にコードを実行することは、アスペクト指向プログラミングと呼ばれます。

于 2012-10-16T07:17:16.157 に答える