实践中的Java并发 - 示例5.3

时间:2016-03-18 07:45:24

标签: java concurrency iteration

如清单5.3所述

for(int i=0;i<vector.size();i++)
    doSomething(vecotr.get(i));
  

即使清单5.3中的迭代可以引发异常,这也是如此   并不意味着Vector不是threadͲsafe。 Vector的状态是   仍然有效,例外情况实际上与其一致   规格。然而,这个东西就像拿最后一样平凡   元素或迭代抛出异常显然是不可取的。

上面的陈述对我来说不清楚。如果在迭代过程中矢量被修改并且它可以抛出异常, Vector的状态将如何有效

1 个答案:

答案 0 :(得分:0)

它不能同步访问向量,这意味着当doSomething正在访问它时,其他一些线程可以删除i位置上的元素,如果我的索引不在边界内,这将抛出outOfBoundsException。 BUD 并不意味着Vector类不处于有效状态,你只是不想体验迭代这种行为,这就是为什么你使用同步只允许一个线程一次访问它。

因此代码示例5.4。

synchronized (vector) {
for (int i = 0; i < vector.size(); i++)
doSomething(vector.get(i));
}

客户端锁定。

你锁定了矢量

  

每个对象都有一个与之关联的内在锁。按照惯例,   需要对对象进行独占和一致访问的线程   fields必须在访问之前获取对象的内部锁   它们,然后在它们完成时释放内在锁。一个   据说线程拥有它之间的内在锁定   获得了锁并释放了锁。只要一个线程拥有一个   内部锁定,没有其他线程可以获得相同的锁定。另一个   线程在尝试获取锁时会阻塞。

即使某些集合是线程安全的,您也可以进入indexOutOfBounds异常,集合的bud状态将是有效的。