所以如果一个程序这样做:
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,没有同步是线程安全的,对吗?
答案 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周围使用不可修改的包装器 - 它将
为了完整起见,请注意以下事实:虽然ArrayList上的操作是线程安全的,但对元素的操作却不是。