arraylist的线程安全实现

Sam*_*msh 1 java concurrency

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

    static ArrayList<X> a = null;
    static{
            for(;;){X x = new X(); a.add(x)}
          }
Run Code Online (Sandbox Code Playgroud)

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

       X x = a.get(i); x.t();
Run Code Online (Sandbox Code Playgroud)

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

Bhe*_*ung 6

如果没有任何改变ArrayList,那么你没有理由担心它的线程安全性.

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


Dan*_*den 6

如果打算在创建列表后不对其进行修改,则强制执行以下操作:将其包装ArrayList在a中Collections.unmodifiableList().

更好的是,如果你有番石榴,可以使用ImmutableList.