我一直在研究编写并发Multimap的问题,并且我有一个由Google Guava AbstractSetMultimap 和 MapMaker 计算地图支持的实现,它可以按需创建值集合作为 ConcurrentHashMap 上的集合视图。通过对视图集合和各种包装器的一些关注,我认为这非常接近。
其他尝试过这个的人已经讨论过的大问题似乎是当它们为空时从底层映射中删除值集合,而不引入竞争条件。
似乎存在几个选项。
- 将空集合留在那里。这会泄漏一些 CHM,但我相信它至少是正确的。
- 尝试乐观地在空时删除集合,并在其中出现任何其他内容时进行补偿。这充满了种族,似乎本质上是不可能解决的。
- 同步 values-collection 上的所有内容,这至少允许删除,但代价是在键初始查找后的任何并发性。
- 对于较小的惩罚(也许,取决于使用模式?),也许在值集合创建和删除时同步,需要检查是否涵盖了所有内容。
问题:
- 有谁知道比这更好的实现?我们可以更好地组合 MapMaker 的部分,还是需要从头开始编写专门的 ConcurrentHashMultimap?
- 如果很难在这方面做出很大改进,那么这种泄漏在实践中是否可能是一个很大的问题?java.util.HashMap、juc.ConcurrentHashMap 和 ArrayDeque 等著名的集合不会向下调整后备存储的大小,而 ArrayList 也不会自动这样做。只要我们清除对象,我想这会不会太重要。
谢谢
编辑:另请参阅番石榴邮件列表上的讨论。
编辑2:我已经写了这个。请参阅此 Google 代码区以了解实现。我将非常感谢任何尝试它的人的反馈,那里而不是这里。