我正在寻找一个线程安全的BloomFilter实现,即如果值按顺序放入筛选器或同时放入筛选器,则其行为将完全相同。番石榴的BloomFilter的javadoc没有提到线程安全性。它是线程安全的吗?线程安全bloomfilter
回答
番石榴的BloomFilter
不是线程安全的。
这就是说,它不是100%清楚你对线程安全的期望是什么语义BloomFilter
- 将put
是原子?我在想象用AtomicLongArray
代替long[]
的效果,我敢肯定你最终的语义是“如果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,但这是你的调用)。
在性能方面,它会将所有请求序列化,因此您不会因并行访问而获得任何性能提升(并且可能会产生瓶颈)。
你的意思是同步? – 2012-07-30 12:17:36
哈,谢谢!必须需要更多的咖啡...... – 2012-07-30 12:31:14
上周我有这个问题。
最终创建了一个番石榴布朗过滤器的包装类,其中我创建了许多过滤器。然后,根据要插入的关键字,我选择了其中一个筛选器并单独进行同步。运行256个过滤器和8个并发线程即使添加了同步,我的CPU利用率也达到了90%。
我已经采用了Apache Cassandra版本来支持并发更新,因为我们在内部需要这个属性。你可以在这里看看:https://github.com/ifesdjeen/blomstre
我制作了不同的bloom滤镜的java库,它们都是线程安全的。一探究竟。 ponkin/bloom
是的,我意识到当我使用“线程安全”这个短语时,我有点含糊不清。我真正想要的是给我原子,但并发put和mightContain操作。因为潜在的逻辑归结为位操作,所以我希望有两种方法可以同时发生。 – ishaaq 2012-07-30 14:04:48
好的,添加问题建议:https://code.google.com/p/guava-libraries/issues/detail?id=1090 – ishaaq 2012-07-31 02:58:57