集合的最佳Java线程安全锁定机制?

时间:2011-01-15 00:45:17

标签: java collections

用于控制Java中对集合的多次访问的最慢的线程安全机制是什么?

我将对象添加到集合的顶部,我非常不确定什么是性能最佳的集合。它会是矢量还是队列?我原本以为ArrayList会很快,但是我做了一些实验而且非常慢。

编辑:在我的插入测试中,使用volatile推出的Vector似乎是最快的吗?

6 个答案:

答案 0 :(得分:6)

查看java.util.concurrent中的馆藏。

答案 1 :(得分:5)

最好的算法尽可能避免共享状态。听起来你是java中多线程编程的新手。为什么不选择你知道正确的东西....然后看看有多少同步,然后看看是否有问题...然后看看你是否能找到更快的方法来做到这一点。

答案 2 :(得分:4)

使用的确切操作应确定使用的内容。但是,由于容器很大程度上是一个抽象类型,所以写它以使其工作 - 可靠 - 然后配置文件,确保功能需求,根据需要进行优化,等等等等。)

通常,我对"concurrent collection"的主要用途是用于在线程之间传输对象的队列。在这种情况下,我开始使用ConcurrentLinkedQueue,如果没有其他原因而不喜欢“无锁”算法(这并不意味着它会更快: - )。

通常,Queue和/或LinkedList是附加到末尾的良好数据结构。根据具体情况,包括特定使用模式,包括:线程争用,删除的项目数,项目删除方式等,除了开始/结束之外的所有“快速杀死”可能< / em>使用clear(AbstractQueue的一部分)和项目重新添加更快地完成 - ConcurrentLinkedQueue允许head 尾部检查/操作。但是,我会敦促“保持简单”,写入“特定接口合同”和“只使用当前方法”,直到有充分证据表明不符合功能要求为止。

就性能而言,它实际上取决于特定的用例/操作数据结构特征和数据结构实现。在某些情况下,ArrayList可能会比Vector慢,并且确实记录在案。如果这种表现有所不同,那么听起来很可疑。 Java Best Practices – Vector vs ArrayList vs HashSet上的文章包含了很好的读物。注意这些评论。

编辑:请记住,“并发”数据结构通常只暗示单个操作(方法调用)是原子的(并且可能不是奇数情况下的所有操作) !)。可能仍然需要实现大范围的同步或其他方法来实现所需的线程安全级别。也就是说,h.putIfAbsent(k,v)(来自ConcurrentHashMap)if (!h.containsKey(k)) { h.put(k, v); }不同 - 作为一个案例,这样的问题适用于“清除”然后添加“上面提到的方法。

快乐的编码。

答案 3 :(得分:0)

也许编写自己的LinkedList实现?

java集合中的那个只保存一个我相信的当前指针。你可以拥有一个头尾的......

您也可以将其包装在Collections.synchronizedList(...)

答案 4 :(得分:0)

呃,如果我理解评论&#34; Vector使用volatile&#34;没错,你可能不太明白同步意味着什么。易失性仅适用于Vector的引用;而且由于Vector本身是同步的,因此是多余的。

但从根本上说,您是否真的认为由于同步(容器访问)导致的性能差异足以让您担心?如果这样做,您应该能够通过分析(访问和/或变异的热点)看到效果。我并不是说没有这种情况可以发生,但它们并不是特别常见。

答案 5 :(得分:0)

ConcurrentSkipListMap / Set - 但你必须知道如何/何时使用它。 CopyOnWriteArrayList是另一个很棒的解决方案(再次需要知道你使用它的原因)。

  
    

编辑:在我的插入测试中,使用volatile推出的Vector似乎是最快的吗?

  

这只是不冷却而且完全无用。