スレッドのセキュリティは同期を必要としないことを意味しますか?


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 task = new FutureTask(() -> {
                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();
        }