3

我正在寻找支持事件通知的并发映射,例如,我可以为特定键注册回调,这些键在放置或删除此类键时调用。整个事情不仅是原子的,而且与 ConcurrentHashMap 一样显示出良好的并发度。

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

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

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

谢谢,奥利弗

4

1 回答 1

0

最直接的解决方案是拦截对 a 的调用以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,您将有一些逻辑来检查地图的状态或其他内容是否匹配某些k,并启动相应的回调。vEventCondition

这种模式,即拦截方法调用以执行一些代码之前和之后的一些代码,称为面向方面编程

于 2012-10-16T07:17:16.157 回答