atomic与线程安全
2020-03-23 本文已影响0人
LamSpeech
atomic在日常开发中是个很少使用,也是个很容易出现错误的知识点,那么atomic能够保证线程安全吗?
答案是不能,至于为什么这么说我们可以从以下几点来看:
1、什么是线程安全
多个线程访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他操作,调用这个对象的行为都可以获得正确的结果,那么这个对象就是线程安全的。
2、线程安全的三个核心体现
原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。
可见性:当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。
有序性:程序执行的顺序按照代码的先后顺序执行。
3、举一个最简单的例子
假设有A/B/C三个线程和一个使用atomic修饰的属性,线程A调了属性的getter方法,与此同时线程B 、线程C都调了属性的setter方法 。
那么最后A得到的值,有3种可能:可能是B、C赋值之前的原始值,也可能是B赋值的值,也可能是C赋值的值。
同时,最终这个属性的值,可能是B赋值的值,也有可能是C赋值的值。
最后我们可以得出一个结论,atomic是不能保证属性线程安全的,因为它修饰的属性并不能完全符合线程安全的三个核心体现。