arraylist的线程安全实现

时间:2012-11-05 00:40:27

标签: java concurrency

所以如果一个程序这样做:

    static ArrayList<X> a = null;
    static{
            for(;;){X x = new X(); a.add(x)}
          }

并且在共享列表上静态初始化之后调用的唯一操作是get()和x.t()

       X x = a.get(i); x.t();

和X无法访问容器&amp;是线程安全的,这应该意味着像这样使用Arraylist,没有同步是线程安全的,对吗?

4 个答案:

答案 0 :(得分:6)

如果没有修改ArrayList,那么你没有理由担心它的线程安全性。

默认情况下,该静态块是线程安全的,因为它在加载类时只运行一次(用于初始化)。

答案 1 :(得分:6)

如果目的是在创建列表后不对其进行修改,则强制执行:将ArrayList包裹在Collections.unmodifiableList()中。

更好的是,如果您有可用的番石榴,请使用ImmutableList

答案 2 :(得分:1)

Vector是您想要的同步集合。

仅仅因为Collection的元素是线程安全的,并不能保证容器本身是线程安全的。基于我对并发的理解。

如果t修改了支持Collection,则它不是线程安全的。例如,t定义如下:

this.list.remove(this.x);

这不安全。

答案 3 :(得分:1)

线程安全只是可写对象的一个​​问题。 初始化后,您的ArrayList是不可变的 - 因此线程安全。考虑在你的arraylist周围使用不可修改的包装器 - 它将

  1. 明确表示该阵列无意修改
  2. 防止将来意外修改
  3. 为了完整起见,请注意以下事实:虽然ArrayList上的操作是线程安全的,但对元素的操作却不是。