Java 使用集合创建数组列表线程时是否存在性能问题。同步列表?

Java 使用集合创建数组列表线程时是否存在性能问题。同步列表?,java,arraylist,Java,Arraylist,您好,我想知道如果我使用Collections.synchronizedList()方法使ArrayList线程安全,是否存在任何性能问题?如果有问题,它会影响哪些功能,如添加、搜索等 我得到了并发修改异常以消除它我使用了Collections Synchronized方法,但后来我知道它有一些性能问题?我的问题很简单,在不影响性能的情况下,我应该使用哪种方法…所有同步列表的方法都使用比直接访问慢的同步 Vector是List的一个实现,它已经同步了所有方法自java 1.4以来,同步本身几乎不

您好,我想知道如果我使用
Collections.synchronizedList()
方法使
ArrayList
线程安全,是否存在任何性能问题?如果有问题,它会影响哪些功能,如添加、搜索等


我得到了并发修改异常以消除它我使用了Collections Synchronized方法,但后来我知道它有一些性能问题?我的问题很简单,在不影响性能的情况下,我应该使用哪种方法…

所有同步列表的方法都使用比直接访问慢的同步


Vector是List的一个实现,它已经同步了所有方法

自java 1.4以来,同步本身几乎不会影响性能。然而,设计有大量同步块的应用程序可能运行缓慢,因为不同的线程正在互相等待

还有其他一些方法可以帮助我们设计多线程应用程序,而无需或只需最少的同步

  • 使用无状态体系结构
  • 使用不可变对象
  • 想想演员模型

  • 是的,你会导致线程被阻塞的开销


    如果您读列表多于写列表,java.util.concurrent.CopyOnWriteArrayList是您的一个选项。读取速度很快,无需锁定。

    在获取不可变列表实例时,您可以使用这种方法,因此无需担心多个线程访问它。
    List immutablelist=集合。不可修改列表(List)

    Collections.synchronizedList((List List))的问题在于:在许多情况下,它并没有真正的用处。例如,对于迭代所有元素, 或者,当得到一个值时,根据它进行计算,并用结果替换它,我们无论如何都必须使用手动同步

    用户必须手动同步返回的数据 在对其进行迭代时列出:

      List list = Collections.synchronizedList(new ArrayList());
          ...
      synchronized (list) {
          Iterator i = list.iterator(); // Must be in synchronized block
          while (i.hasNext())
              foo(i.next());
      }
    
    未能遵循此建议可能会导致不确定性 行为。


    你为什么不直接使用向量呢?这是一个有效的问题。。请给出原因。
    java.util.Vector
    几乎不受欢迎。避免在代码中使用
    Vector
    Hashtable
    。如果且仅当您确实需要同步时,请使用其他集合并使用
    集合。synchronizedList()
    和类似方法。您确定同步不会影响性能吗?因为我的数组列表很重。它有100多条记录,我对它执行各种操作…谢谢你的回复@AlexR@saurabh一个列表中有100多个元素小得可笑。如果其中有100000个元素,则可以认为它是一个大列表,即使性能问题也不是同步本身。