- 主题:多线程下赋值重排序问题
这种场景volatile解千愁
当然你要先在本地完成一切对象初始化
然后一句赋值完活,volatile保证地址操作原子性
P.S.
标准库里的atomicReference
基本的get/set也是这样实现的
CAS什么的再议
【 在 sjfdesolve 的大作中提到: 】
: set内部不会变化
: 只是担心对象本身还没初始化或者变动完成
: 后面的赋值操作被重排序到前面
: ...................
--
修改:javafish FROM 112.132.213.*
FROM 112.132.213.*
重排序是指相对于其他线程的变量值的可见性
可能因重排序而不可确定
线程内没这个问题
【 在 sjfdesolve 的大作中提到: 】
: 和原子性没啥关系吧
: 你要说原子性除非是下面三个语句整体原子性
: feetSet2 = new HashSet();
: ...................
--
修改:javafish FROM 183.146.16.*
FROM 183.146.16.*
你变量初始化过程都是在局部变量中完成的话
对线程外完全不可见,还能有啥问题
可能被外部线程访问的类变量
赋值操作靠volatile
如果要在跨线程变量上直接操刀或者有CAS操作之类
用atomicReference保证时序
【 在 sjfdesolve 的大作中提到: 】
: ...
: 我说的就是多线程场景下
: A线程给对象里的域赋值
: ...................
--
修改:javafish FROM 58.218.213.*
FROM 58.218.213.*