Java 寻找支持并发映射的事件

Java 寻找支持并发映射的事件,java,concurrency,map,event-handling,Java,Concurrency,Map,Event Handling,我正在寻找一个支持事件通知的并发映射,例如,我可以注册一个特定键的回调,这些键在放置或移除时被调用。whle不仅是原子的,而且与ConcurrentHashMap一样显示出良好的并发性 我的第一次尝试是从ConcurrentHashMap中窃取基于段的解决方案,并向段类添加一些事件注册表。但事实证明,这比预期的要困难。计算段偏移似乎不是那么简单。如果你不了解ConcurrentHashMap的工作原理,那么仅仅从ConcurrentHashMap中窃取解决方案就不是那么容易了(你错过了一些细节,

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

我的第一次尝试是从ConcurrentHashMap中窃取基于段的解决方案,并向段类添加一些事件注册表。但事实证明,这比预期的要困难。计算段偏移似乎不是那么简单。如果你不了解ConcurrentHashMap的工作原理,那么仅仅从ConcurrentHashMap中窃取解决方案就不是那么容易了(你错过了一些细节,结果你的东西出了问题)。也许有人知道一些文章解释了ConcurrentHashMap中的分段解决方案是如何工作的?比我自己能解决的还多

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

我希望有人知道一些映射或事件注册表实现,可以实现我想要的功能,或者链接到一些文章,解释COncurrentHashMap中的分段算法是如何工作的


谢谢,Oliver最简单的解决方案是拦截对
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) { ... }
}
类ConcurrentHashMapWithEvent扩展了ConcurrentHashMap{
...
@覆盖公共V put(K键,V值){
System.out.println(“这就在put(“+k+”,“+v+”)之前”);
super.put(k,v);
System.out.println(“这就在put(“+k+”,“+v+”)之后”);
}
...
公共无效注册表回调(EventCondition cond,回调){…}
}
您不必使用
println
,而是可以使用一些逻辑来检查
k
v
、映射的状态或任何东西是否与一些
EventCondition
匹配,并启动相应的回调


这种模式,即拦截方法调用以在之前执行一些代码,在之后执行一些代码。

是的,谢谢。问题在于,在put或remove之后,必须在没有上下文切换的情况下在put/remove和侦听器调用之间进行迭代。否则,您可能会遇到侦听器的invocatin与put/remove操作的时间不一致的情况,例如,调用侦听器的顺序并不反映put/remove操作的顺序。因此,put/remove和listener调用必须在一个降低并发性的同步块中进行。我想我现在发现了一些有用的东西:那里的段解决方案非常简单,可能足以满足我的目的。这会有帮助吗?谢谢,据我所知,这个映射不允许添加put/remove上的回调侦听器。