有下面的这段代码:
int i=5;
i=i++;
System.out.println(i);
可以发现输出5。
执行过程
一般我们会以为结果是6,因为i++是一个自增操作,自增完了那么i不就是6了嘛!
可通过反编译这段代码,我们可以发现它的字节码如下图所示:
可以发现执行i=i++时,先是把i压入了操作数栈,之后执行了+1操作,使得局部变量表中得i变成了6,之后又把操作数栈中的i(这个i是5)出栈,覆盖局部变量表中i的值。
所以最后发现输出的i是5而不是6。
线程不安全
i++这个操作是线程不安全的,从之前的字节码就可以分析出来。
i++被分解成了下面这两步:
int tmep=i;
i=i+1;