当前位置: 首页 > 面试题库 >

向量与Collections.synchronizedList(ArrayList)

江正德
2023-03-14
问题内容

向量是同步的,ArrayList是不同步的,但是我们可以通过来同步ArrayList
Collections.synchronizedList(aList),那么哪个会更好,更快地执行?


问题答案:

同步收集既浪费时间又危险。一个很简单的例子,为什么它们不好,是考虑两个线程在同一集合上同时运行一个循环:

int i = 0;
while (i < list.size())
{
  if (testSomeCondition(list.get())) {
    list.remove(i);
  else
    i++;
}

我们的列表可能是同步的(例如,Vector),并且此代码仍然可怕地中断。为什么?因为对size(),get(),remove()的单个调用是同步的,但是一个线程仍可以从列表中删除项目,而另一个线程对其进行迭代。换句话说,我们有一个竞争条件,使用同步集合并没有给我们带来任何好处。

为了解决这个问题,我们必须同步集合上的整个操作,或者使用Java 5并发锁来做到这一点。

synchronized (list) {
  int i = 0;
  while (i < list.size())
  {
    if (testSomeCondition(list.get())) {
      list.remove(i);
    else
      i++;
  }
}

现在,此代码块是线程安全的,因为一次只能有一个线程可以执行循环。现在,没有理由使用同步集合。我们可以使用ArrayList代替Vector,并节省所有同步调用的性能损失。

因此,请勿使用同步集合。如果发现自己有多个线程在同一个列表中,则需要保护列表中的操作,而不是单个调用。



 类似资料:
  • 假设没有特殊方法(就像)来重新配置s,那么IDRIS中是否存在随机访问数据类型? 如何在代数类型系统中定义这样的东西?当然,似乎不可能归纳地定义它。 在像Idris这样的类型系统中,是否有可能创建一个支持O(1)随机访问的数据类型,并知道它的长度,以便所有访问都是可证明的有效的?(Haskell有数组样式的向量,但它们的具体实现对包括我在内的普通用户来说是不透明的)

  • 问题内容: 因此,在标头的c ++文档中,有一个不错的函数可让您对向量进行排序。我上课。我有一个指向该类()对象的指针向量,并且我想通过不同的参数(例如年龄,姓名长度等)来比较人员。 我已经有返回所需变量的函数,但是我不确定该怎么做。这是c ++参考http://www.cplusplus.com/reference/algorithm/sort/中的排序向量函数的链接。 问题答案: 很简单: 然

  • 问题内容: 大家都说,由于性能的原因,应该使用vector(因为Vector在每次操作和所有操作之后都会同步)。我写了一个简单的测试: 结果如下: 基于此,似乎在遍历和阅读方面的表现要好一些。也许这是一个愚蠢的任务,或者我做出了错误的假设-有人可以解释一下吗? 问题答案: 您已经编写了一个幼稚的微基准测试。在JVM上进行微基准测试是一项非常棘手的事情,要列举所有的陷阱甚至不容易,但是这里有一些经典

  • 从本质上说,我希望重用向量空间定义的一些实例。

  • 我不明白为什么println是给我0。有什么想法吗? 这是游乐场的链接。https://play.rust-lang.org/?version=stable

  • 矢量或者说向量,可以通过2~4个分量表示一个向量,比如通过vec3(1,0,0)表示三维空间中一个沿着x轴正方向的三维方向向量,如果你有高中数学的基础,应该对向量有一定的了解,对于三维坐标的相关几何运算也有一定的概念。 关键字 数据类型 vec2 二维向量,具有xy两个分量,分量是浮点数 vec3 三维向量 ,具有xyz三个分量,分量是浮点数 vec4 四维向量 ,具有xyzw四个分量,分量是浮点