线程安全的bloomfilter

时间:2012-07-30 10:58:58

标签: java guava

我正在寻找一个线程安全的BloomFilter实现,即如果值按顺序放入过滤器或同时并行放置,则实现的行为完全相同。 guava的BloomFilter的javadoc对线程安全性保持沉默。它是线程安全的吗?

5 个答案:

答案 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