假设有一个类
class Cat
{
int i;
String b;
List<Integer> l;
Set<Foot> feetSet;
}
现在有一个对象cat
在多线程下
多个线程对cat进行读,可能遍历l或者feetSet
有且仅一个线程对cat进行写,譬如将i,b,l,feetSet赋值为另外一个值
譬如
feetSet2 = new HashSet();
feetSet2.add(..);
..
cat.feetSet = feetSet2;
有的说法是,这会导致unsafe publication
即feetSet2可能还没初始化完成,但是因为重排序其地址就被读线程拿到了,结果一访问就出错抛异常了,大家怎么看?
有的说法是这些域加个volatile能解决,但是我感觉volatile只是让地址更加实时的暴露,而不是保证指向的内容初始化完成才暴露地址
--
FROM 122.115.231.*