原子性、可见性和有序性
当然,重排序也不是随便就打乱顺序的(保证As-if-serial语义),单线程下存在依赖关系的代码顺序是不能被打乱的,而在多线程下由于多个线程数据的依赖关系比较复杂,难以预测和分析,因此交给软件开发者来指明,而硬件开发者则需要提供相关指令(如内存屏障)供软件开发者使用。
总结:
只有原子性是不能保证线程安全的。就算操作原子了,其运算的结果不能让另一个线程看到,另一个线程还是读的旧值,那结果还是错误的。
但是就算有了原子性和可见性,也不能保证线程安全。我们本来期望在某行代码处能看到前面代码的运算结果,结果由于重排序,前面代码被重排到后面了。因此在此处我们看到了旧值(可见是可见了,但期望的代码排到后面了还未执行)。
因此要保证线程安全,原子性、可见性和有序性缺一不可。