Java并发实践-示例5.3

Java并发实践-示例5.3,java,concurrency,iteration,Java,Concurrency,Iteration,如清单5.3所示 for(int i=0;i<vector.size();i++) doSomething(vecotr.get(i)); 用于(int i=0;i它对向量的访问不同步,这意味着当doSomething访问它时,其他线程可以删除i位置上的元素,如果i索引不在范围内,这将抛出boundsException。BUD这并不意味着向量类处于无效状态,您只是不想经历过度迭代这就是为什么使用同步一次只允许一个线程访问它 因此,代码示例5.4 synchronized (vec

如清单5.3所示

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

用于(int i=0;i它对向量的访问不同步,这意味着当doSomething访问它时,其他线程可以删除i位置上的元素,如果i索引不在范围内,这将抛出boundsException。BUD这并不意味着向量类处于无效状态,您只是不想经历过度迭代这就是为什么使用同步一次只允许一个线程访问它

因此,代码示例5.4

synchronized (vector) {
for (int i = 0; i < vector.size(); i++)
doSomething(vector.get(i));
}
synchronized(向量){
对于(int i=0;i
客户端锁定

你锁定向量

每个对象都有一个与之关联的内在锁。按照惯例, 一个线程,需要对对象的 字段在访问之前必须获取对象的固有锁 然后在处理完它们后释放内部锁。A 线程被称为拥有它拥有的时间之间的内在锁 获取锁并释放锁。只要线程拥有 内在锁,没有其他线程可以获得相同的锁 线程在尝试获取锁时将阻塞

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