selector

atomic与线程安全

2020-03-23  本文已影响0人  LamSpeech

atomic在日常开发中是个很少使用,也是个很容易出现错误的知识点,那么atomic能够保证线程安全吗?

答案是不能,至于为什么这么说我们可以从以下几点来看:


1、什么是线程安全

多个线程访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他操作,调用这个对象的行为都可以获得正确的结果,那么这个对象就是线程安全的。

2、线程安全的三个核心体现

原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。

可见性:当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。

有序性:程序执行的顺序按照代码的先后顺序执行。

3、举一个最简单的例子

假设有A/B/C三个线程和一个使用atomic修饰的属性,线程A调了属性的getter方法,与此同时线程B 、线程C都调了属性的setter方法 。                        

那么最后A得到的值,有3种可能:可能是BC赋值之前的原始值,也可能是B赋值的值,也可能是C赋值的值。                                                                

同时,最终这个属性的值,可能是B赋值的值,也有可能是C赋值的值。

最后我们可以得出一个结论,atomic是不能保证属性线程安全的,因为它修饰的属性并不能完全符合线程安全的三个核心体现。

上一篇下一篇

猜你喜欢

热点阅读