我正在寻找一个支持事件通知的并发映射,例如,我可以为在放入或移除这样的键时调用的特定键注册回调。whle不仅是原子的,而且与ConcurrentHashMap一样显示了良好的并发性。
我的第一次尝试是从ConcurrentHashMap中窃取基于分段的解决方案,并在分段类中添加一些事件注册表。但事实证明,这比预期的要困难。计算分段偏移量似乎并不是那么简单。如果你不了解ConcurrentHashMap的工作原理(你错过了一些细节,你的东西最终会有问题),那么从ConcurrentHashMap中窃取解决方案就不那么容易了。也许有人知道一些论文解释了ConcurrentHashMap中的分段解决方案是如何工作的?超过了我的工作方式。
只需在我的map put或remove方法中放入一个大的同步块就很容易了,这样就可以在一个同步块中进行put或remov以及侦听器的调用。但这最终会降低并发性,使解决方案成为具有单个段的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) { ... }
}
您将使用一些逻辑来检查k
、v
、映射的状态或其他内容是否与某些EventCondition
匹配,而不是println
,并启动相应的回调。
这种模式,即拦截方法调用以执行之前的一些代码和之后的一些代码,称为面向方面编程。