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