【问题标题】:Looking for concurrent map supporting events寻找并发地图支持事件
【发布时间】:2012-10-06 05:37:18
【问题描述】:

我正在寻找支持事件通知的并发地图,例如我可以为在 put 或 remove 上调用的特定键注册回调。整个事情不仅是原子的,而且与 ConcurrentHashMap 一样显示出良好的并发度。

我的第一次尝试是从 ConcurrentHashMap 中窃取基于段的解决方案,并将一些事件注册表添加到段类中。但事实证明,这比预期的要难。计算段偏移似乎不是那么简单。如果您不了解它是如何工作的(您错过了一些细节并且您的东西最终会出现错误),那么仅仅从 ConcurrentHashMap 中窃取解决方案并不是那么容易。也许有人知道一些解释 ConcurrentHashMap 中的段解决方案如何工作的论文?比我能完成的工作。

在我的 map put 或 remove 方法中放置一个大的同步块很容易,这样监听器的 put 或 remove 和调用都发生在一个同步块中。但这最终会降低并发性,使解决方案成为一种具有单个段的 ConcurrentHashMap。

我希望有人知道一些地图或事件注册表实现可以做我想要的,或者一些论文的链接解释了 COncurrentHashMap 中的这种分割算法是如何工作的。

谢谢,奥利弗

【问题讨论】:

标签: java concurrency map event-handling


【解决方案1】:

最直接的解决方案是拦截对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

【讨论】:

  • 好的,谢谢。问题在于,在 put 或 remove 之后必须对已注册的侦听器进行迭代,而不能在 put/remove 和侦听器调用之间进行上下文切换。否则,您可能会遇到侦听器的调用与 put/remove 操作不同步的情况,例如调用侦听器的顺序不反映放置/删除操作的顺序。因此,put/remove 和 listener 调用必须在一个同步块中,从而降低并发性。
猜你喜欢
  • 1970-01-01
  • 2022-09-24
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多