Vector的复合操作,会再次出现线程安全问题。
import java.util.Vector;
public class Demo {
public static void main(String[] args) {
new Thread(() -> {
test();
},"A").start();
new Thread(() -> {
test();
},"B").start();
}
static Vector<Integer> vector = new Vector<>();
//解决办法:符合操作加锁
private static void test() {
for (int i = 0; i < 10; i++) {
vector.add(i);
}
for (int i = 0; i < vector.size(); i++) {
System.out.println(Thread.currentThread().getName() + vector.get(i));
vector.remove(i);
i--;
}
}
}
vector的每个方法都加了synchronized 是同步的,但是把两个同步的方法在同一个线程中就不能保证原子性了。
如上面:vector.add(i); 和 vector.remove(i);