这个问题本身是错误的观点,基本数据类型是数据结构,原子性是操作定义,不是一个概念。
原话是这样的,基本数据类型的赋值是原子性操作。这里还要排除long和double,或者标明64bit操作系统。因为long和double类型是8字节,而低位操作系统(32bit)单次内存的存储结构最大只能存储4个字节,所以每次操作都要分两次进行,也就是非原子性操作。
那int类型的i++为什么还有线程安全问题(推测了问题真正想表达的意思)?因为i++在指令中是赋值和自增两个操作。赋值没问题,但自增是要读取和写入两个操作,很明显是非原子性操作,自然就有安全问题。另外volatile只有两个作用,一个是禁用指令重排,一个是强制读取主存,没有绝对的原子性。