我正在寻找一个线程安全的BloomFilter实现,即如果值按顺序放入过滤器或同时并行放置,则实现的行为完全相同。 guava的BloomFilter的javadoc对线程安全性保持沉默。它是线程安全的吗?
番石榴的BloomFilter
不是线程安全的。
也就是说,对于我来说,对于一个线程安全的BloomFilter
你会期望什么语义不是100%清楚 - put
会原子化吗?我想象用long[]
替换AtomicLongArray
的效果,我很确定你最终的语义是“如果put(x)
发生 - 在mightContain(x)
之前,然后mightContain(x)
返回true
”,我认为那些语义是有用的,但我认为我不是积极的。
这可能值得filing an issue具有特定的用例,但是有一些细节可以确定线程安全在这里的含义。
正如其他人所指出的那样,最好的解决方案是修补现有框架以使其具有线程安全性。但是为了更直接的需求,考虑将非线程安全版本包装在线程安全的外观中:
public class ThreadSafeBloomFilter {
private BloomFilter filter;
public ThreadSafeBloomFilter(BloomFilter filter) {
this.filter = filter;
}
public synchronized void add(Object obj) {
filter.add(obj);
}
}
以类似的方式实现您需要的其他方法。你可能也想让它变得更好和通用(比如ThreadSafeBloomFilter,但那是你的调用)。
在性能方面,这将序列化所有请求,因此您不会通过并行访问来获得任何性能提升(并且可能会产生瓶颈)。
上周我遇到了这个问题。
结束为番石榴布隆过滤器创建包装类,在那里我创建了许多过滤器。然后根据插入的键我选择了一个过滤器并单独同步。使用256个过滤器和8个并发线程运行,即使增加了同步,我也达到了90%的CPU利用率。
我采用了Apache Cassandra版本来支持并发更新,因为我们在内部需要这个属性。你可以在这里查看:https://github.com/ifesdjeen/blomstre
我用不同的bloom过滤器创建了java库,它们都是线程安全的。看看这个。 ponkin/bloom