volatile解决的是多线程间共享变量的可见性问题,而保证不了多线程间共享变量原子性问题。
对于多线程的i++,++i,依然还是会存在多线程问题,volatile是无法解决的
比如:变量i=0,A线程更新i+1,B线程也更新i+1,经过2次自增操作之后,i可能不等于2,而是等于1;
原因是i++和++i并非原子操作,我们通过javaP查看字节码,会发现
void f1() { i++; }
的字节码‘如下:
void f1();
Code:
0: aload_0
1: dup
2: getfield #2; //Field i:I
5: iconst_1
6: iadd
7: putfield #2; //Field i:I
10