【发布时间】:2015-11-18 16:35:29
【问题描述】:
如果我决定使用非线程安全集合并同步其访问,我是否需要同步构造函数中的任何突变?例如,在下面的代码中,我理解对列表的引用将在构造后对所有线程可见,因为它是最终的。但是我不知道这是否构成安全发布,因为构造函数中的 add 是不同步的,它是在 ArrayList 的 elementData 数组中添加一个引用,这是非最终的。
private final List<Object> list;
public ListInConstructor()
{
list = new ArrayList<>();
// synchronize here?
list.add(new Object());
}
public void mutate()
{
synchronized (list)
{
if (list.checkSomething())
{
list.mutateSomething();
}
}
}
【问题讨论】:
-
您是否以任何方式同步初始化/访问
ListInConstructor实例? -
不,我不会以任何方式同步 ListInConstructor 对象,但如果有影响,它会存储在 final 字段中。
标签: java multithreading