加了volatile 为什么结果不对?

volatile 的作用是保证可见性和禁止对其进行指令重排序,但是不保证原子性,i ++ 操作不是原子性的

volatile关键字与线程同步没有关系的,增加了该关键字的作用是在修改变量值时直接操作内存,减少了先把变量复制一个副本进行修改后再存回内存的过程;

线程同步需要使用 synchronized关键字对控制代码块或方法进行线程同步控制。

volatile 的作用是保证可见性和禁止对其进行指令重排序,但是不保证原子性。如果要保证原子性建议使用AtomicInteger.

可以将static volatile int i =1; 改成AtomicInteger atomicInteger = new AtomicInteger(0);

 

然后i++;改成atomicInteger.getAndIncrement();

就可以实现原子性了。

要清楚顺序操作!=原子操作,原子操作才能保证数据在多线程环境下的安全。