Vector的复合操作,会再次出现线程安全问题。

    1. import java.util.Vector;
    2. public class Demo {
    3. public static void main(String[] args) {
    4. new Thread(() -> {
    5. test();
    6. },"A").start();
    7. new Thread(() -> {
    8. test();
    9. },"B").start();
    10. }
    11. static Vector<Integer> vector = new Vector<>();
    12. //解决办法:符合操作加锁
    13. private static void test() {
    14. for (int i = 0; i < 10; i++) {
    15. vector.add(i);
    16. }
    17. for (int i = 0; i < vector.size(); i++) {
    18. System.out.println(Thread.currentThread().getName() + vector.get(i));
    19. vector.remove(i);
    20. i--;
    21. }
    22. }
    23. }

    vector的每个方法都加了synchronized 是同步的,但是把两个同步的方法在同一个线程中就不能保证原子性了。
    如上面:vector.add(i); 和 vector.remove(i);