如清单5.3所述
for(int i=0;i<vector.size();i++)
doSomething(vecotr.get(i));
即使清单5.3中的迭代可以引发异常,这也是如此 并不意味着Vector不是threadͲsafe。 Vector的状态是 仍然有效,例外情况实际上与其一致 规格。然而,这个东西就像拿最后一样平凡 元素或迭代抛出异常显然是不可取的。
上面的陈述对我来说不清楚。如果在迭代过程中矢量被修改并且它可以抛出异常, Vector的状态将如何有效。
答案 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状态将是有效的。