執行緒安全意味著不需要同步了嗎?

技術小甜發表於2017-11-15

即使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();
        }












本文轉自cnn23711151CTO部落格,原文連結:http://blog.51cto.com/cnn237111/2056121 ,如需轉載請自行聯絡原作者


相關文章