使用集合制作阵列列表线程是否存在任何性能问题。同步列表?

时间:2013-11-20 09:41:01

标签: java arraylist

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

我正在获得并发修改异常以摆脱它我使用了Collections Synchronized方法但后来我才知道它有一些性能问题?我的问题很简单,我应该使用哪种方法而不影响性能......

5 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

还有其他方法可以帮助我们在没有或同步最少的情况下设计多线程应用程序。

  1. 使用无状态架构
  2. 使用不可变对象
  3. 想一下演员模特

答案 2 :(得分:0)

是的,你招致线程被阻塞的开销......

如果您阅读的列表多于您写入的列表,则java.util.concurrent.CopyOnWriteArrayList是您的选项。读取速度很快,没有锁定。

答案 3 :(得分:0)

您可以使用此方法,因为您正在获取不可变列表实例,因此无需担心多个线程占用它。 列出immutablelist = Collections.unmodifiableList(list);

答案 4 :(得分:0)

Collections.synchronizedList((List<T> list))的问题在于:在许多情况下,它并没有真正有用。例如,迭代所有元素,  或者在获取值时,根据它进行计算,并将其替换为结果,我们无论如何都必须使用手动同步。

来自Collections.synchronizedList((List<T> list))

的文档
  

用户必须手动同步返回的内容   迭代时列出:

  List list = Collections.synchronizedList(new ArrayList());
      ...
  synchronized (list) {
      Iterator i = list.iterator(); // Must be in synchronized block
      while (i.hasNext())
          foo(i.next());
  }
     

不遵循此建议可能会导致不确定性   行为。