volatile 的作用是保证可见性和禁止对其进行指令重排序,但是不保证原子性,i ++ 操作不是原子性的
volatile关键字与线程同步没有关系的,增加了该关键字的作用是在修改变量值时直接操作内存,减少了先把变量复制一个副本进行修改后再存回内存的过程;
线程同步需要使用 synchronized关键字对控制代码块或方法进行线程同步控制。
volatile 的作用是保证可见性和禁止对其进行指令重排序,但是不保证原子性。如果要保证原子性建议使用AtomicInteger.
可以将static volatile int i =1; 改成AtomicInteger atomicInteger = new AtomicInteger(0);
然后i++;改成atomicInteger.getAndIncrement();
就可以实现原子性了。
要清楚顺序操作!=原子操作,原子操作才能保证数据在多线程环境下的安全。