不过需要注意的是:即使使用了同步容器,有时候不一定能真正的做到线程安全,
package com.moluo.concurrency.syncContainer;
import com.moluo.concurrency.annotation.NotThreadSafe;
import java.util.Vector;
@NotThreadSafe
public class VectorExample2 {
public static Vector<Integer> vector = new Vector<>();
public static void main(String[] args) throws InterruptedException {
while (true) {
for (int i = 0; i < 10; i++) {
vector.add(i);
}
Thread thread = new Thread(() -> {
for (int i = 0; i < vector.size(); i++) {
vector.remove(i);
}
});
Thread thread1 = new Thread(() -> {
for (int i = 0; i < vector.size(); i++) {
vector.get(i);
}
});
thread.start();
thread1.start();
}
}
}
同时建议:在做遍历的时候,尽量不要做更新操作,不然很可能出问题。如下例:
package com.moluo.concurrency.syncContainer;
import com.moluo.concurrency.annotation.NotThreadSafe;
import java.util.Iterator;
import java.util.Vector;
@NotThreadSafe
public class VectorExample3 {
// 抛出异常java.util.ConcurrentModificationException
public static void test1(Vector<Integer> vector) { // foreach
for (Integer integer : vector) {
if (integer.equals(3)) {
vector.remove(integer);
}
}
}
// 抛出异常java.util.ConcurrentModificationException
public static void test2(Vector<Integer> vector) { // iterator
Iterator<Integer> iterator = vector.iterator();
while (iterator.hasNext()) {
Integer integer = iterator.next();
if (integer.equals(3)) {
vector.remove(integer);
}
}
}
// 正常运行
public static void test3(Vector<Integer> vector) {
for (int i = 0; i < vector.size(); i++) {
if (vector.get(i).equals(3)) {
vector.remove(i);
}
}
}
public static void main(String[] args) throws InterruptedException {
Vector<Integer> vector = new Vector<>();
vector.add(1);
vector.add(2);
vector.add(3);
test1(vector);
// test2(vector);
// test3(vector);
}
}
如果一定要做更新操作,建议在遍历过程中做好标记,等遍历完后,再取出标记值做更新操作