ArrayList.toArray()方法最后实现是下面的代码
 public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }
 public static native void arraycopy
effective java 2 th p 107上提到list.toArray()方法是内部锁定,是线程安全的
而 System.arraycopy是本地方法
为什么说上面的方法是线程安全的,没有看到内部锁定

解决方案 »

  1.   

    返回的数组将是“安全的”,因为此 collection 并不维护对返回数组的任何引用。(换句话说,即使 collection 受到数组的支持,此方法也必须分配一个新的数组)。因此,调用方可以自由地修改返回的数组。此处的安全不是你所理解的那样,这里的意思就是返回值是一个新的数组,你想怎么操作就怎么操作,不会有人跟你争
    如果返回值不是一个新的数组,而与collection 内部可能的数组是同一个,那么collection 有可能修改数组,你的程序也可能对返回的数组进行修改,这样就不安全了