会。
多线程加锁synchronze 就对了,除非你有非常强的理由不加。
【 在 sjfdesolve (dfljsdklfjsdlkfjsd) 的大作中提到: 】
: 标 题: 多线程下赋值重排序问题
: 发信站: 水木社区 (Fri Dec 3 17:09:50 2021), 站内
:
: 假设有一个类
: 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只是让地址更加实时的暴露,而不是保证指向的内容初始化完成才暴露地址
:
: --
:
: ※ 来源:·水木社区
http://www.mysmth.net·[FROM: 122.115.231.*]
--
FROM 73.15.185.*