由此可以看出,volatile不保证原子性,否则运行结果应与synchronized修饰的结果一样。可见性只能保证每次读取的是最新的值,但是volatile没办法保证对变量的操作的原子性。代码中的i++这种自增操作并不是一个原子操作,也就是非线程安全的。i++的操作步骤分解如下:
(1)从内存中取出 i 的值
(2)计算 i 的值
(3)将 i 的值写到内存中
假如在第(2)步计算值的时候,有另外一个进程修改了 i 的值,那么这个时候就会出现脏读(这就是上面运行结果count始终小于10000的原因)。解决的办法其实就是使用synchronized,所以说volatile本身并不处理数据的原子性,而是强制对数据的读写及时影响到主内存。