2012-07-30 270 views
3

我正在寻找一个线程安全的BloomFilter实现,即如果值按顺序放入筛选器或同时放入筛选器,则其行为将完全相同。番石榴的BloomFilter的javadoc没有提到线程安全性。它是线程安全的吗?线程安全bloomfilter

回答

2

番石榴的BloomFilter不是线程安全的。

这就是说,它不是100%清楚你对线程安全的期望是什么语义BloomFilter - 将put是原子?我在想象用AtomicLongArray代替long[]的效果,我敢肯定你最终的语义是“如果put(x)发生在mightContain(x)之前,那么mightContain(x)返回true”,我认为这些语义是有用的,但是我不积极。

这可能值得filing an issue与一个特定的用例,但会有一些细节,以确定线程安全在这里意味着什么。

+0

是的,我意识到当我使用“线程安全”这个短语时,我有点含糊不清。我真正想要的是给我原子,但并发put和mightContain操作。因为潜在的逻辑归结为位操作,所以我希望有两种方法可以同时发生。 – ishaaq 2012-07-30 14:04:48

+0

好的,添加问题建议:https://code.google.com/p/guava-libraries/issues/detail?id=1090 – ishaaq 2012-07-31 02:58:57

0

正如其他人已经指出的,最好的解决方案是修补现有的框架,使其线程安全。但是,对于一个更迫切的需要,考虑在一个线程安全的包装外观的非线程安全版本:

public class ThreadSafeBloomFilter { 
    private BloomFilter filter; 

    public ThreadSafeBloomFilter(BloomFilter filter) { 
    this.filter = filter; 
    } 

    public synchronized void add(Object obj) { 
    filter.add(obj); 
    } 
} 

实现你以同样的方式所需要的其他方法。你可能也想使它更好,更通用(像一个ThreadSafeBloomFilter,但这是你的调用)。

在性能方面,它会将所有请求序列化,因此您不会因并行访问而获得任何性能提升(并且可能会产生瓶颈)。

+0

你的意思是同步? – 2012-07-30 12:17:36

+0

哈,谢谢!必须需要更多的咖啡...... – 2012-07-30 12:31:14

0

上周我有这个问题。

最终创建了一个番石榴布朗过滤器的包装类,其中我创建了许多过滤器。然后,根据要插入的关键字,我选择了其中一个筛选器并单独进行同步。运行256个过滤器和8个并发线程即使添加了同步,我的CPU利用率也达到了90%。

0

我制作了不同的bloom滤镜的java库,它们都是线程安全的。一探究竟。 ponkin/bloom