寻找并发地图支持事件

时间:2012-10-16 07:11:30

标签: java concurrency map event-handling

我正在寻找支持事件通知的并发地图,例如我可以为在这样的密钥上放置或删除时调用的特定密钥注册回调。而且,与ConcurrentHashMap一样,whle事物不仅是原子的,而且还显示出良好的并发性。

我的第一次尝试是从ConcurrentHashMap窃取基于段的解决方案,并将一些事件注册表添加到段类中。但事实证明这比预期更难。计算细分偏移量似乎并非微不足道。如果你不理解它是如何工作的,那么从ConcurrentHashMap中窃取解决方案就不那么容易了(你错过了一些细节而你的东西最终变成了错误)。也许有人知道一些文章解释了ConcurrentHashMap中的段解决方案是如何工作的?我可以继续努力。

很容易在我的map put或remove方法中放置一个大的synchronized块,以便在一个synchronized块中发生或删除和调用侦听器。但是这会降低并发性,最终会使解决方案成为具有单个段的ConcurrentHashMap。

我希望知道某些地图或事件注册表实现的人能够做我想要的事情,或者某些文章的链接,解释COncurrentHashMap中的这种分割算法是如何工作的。

谢谢,奥利弗

1 个答案:

答案 0 :(得分:0)

最直接的解决方案是拦截对ConcurrentHashMap的调用,以便通过您注册的事件得到通知。一种方法是将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,您可以使用一些逻辑来检查kv,地图的状态或其他内容是否匹配某些EventCondition,以及启动相应的回调。

这种模式,即拦截方法调用以执行某些代码之前和之后的某些代码,称为Aspect Oriented Programming