線程安全意味着不須要同步了嗎?

版權聲明: 本文由 一隻博客 發表於 bloghome博客
文章連接: https://www.bloghome.com.cn/user/cnn237111java

即便Java方法說明文檔說是線程安全的,不表明就多線程下的線程操做確定安全,仍是會遇到同步問題的。
好比Vector,對比ArrayList是一個線程安全的類,可是不恰當的操做,仍是會有問題,下面的代碼中,Vector中放了10000個數字,有20個線程,循環刪除這個列表中的最後一個數字。
運行的時候,很大的機率會出現java.lang.ArrayIndexOutOfBoundsException的異常,由於檢測到size的時候和執行刪除的時候,size是不一樣的,程序可能會出現異常。安全

for (int i = 0; i < 10000; i++) {
            c.add(i);
        }

        for (int i = 0; i < 20; i++) {
            FutureTask<Integer> task = new FutureTask<Integer>(() -> {
                while (c.size() > 0) {
                    try {
                        c.remove(c.size() - 1);
                    }
                    catch (Exception e) {
                        // // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                System.out.println("thread finished");
                return 0;
            });
            new Thread(task).start();
        }
相關文章
相關標籤/搜索