Java:i++问题(详细分析)

JerryXia 发表于 , 阅读 (48)

看着其实比较明确了,但是说实话其实没看懂,什么是中间缓存变量机制,为什么要有这个,官方文档在哪?

这些问题不是很明了,国外的权威资料暂时也没得求证,所以索性从字节码的角度来理解这个问题。

解法二

通过javap工具查看虚指令,通过虚指令理解c=c++到底做了什么。

下面结果只保留部分主要内容来说明c=c++和其它几种情况的不同,直接翻译虚指令对应程序中的具体操作。

[root@z1 classdir]# javap -verbose SumPlusTestClassfile /mnt/workspace/java/i++issue/classdir/SumPlusTest.class  Last modified Sep 3, 2015; size 794 bytes  MD5 checksum 3a406dc81fe69722d53ce74ef96516a4public class SumPlusTest  minor version: 0  major version: 51  flags: ACC_PUBLIC, ACC_SUPERConstant pool:   #1 = Methodref          #14.#30        //  java/lang/Object."<init>":()V   #2 = Fieldref           #31.#32        //  java/lang/System.out:Ljava/io/PrintStream;  ......  #54 = Utf8               println  #55 = Utf8               (Ljava/lang/String;)V{  public SumPlusTest();    flags: ACC_PUBLIC    Code:      stack=1, locals=1, args_size=1         0: aload_0                1: invokespecial #1                  // Method java/lang/Object."<init>":()V         4: return              LocalVariableTable:        Start  Length  Slot  Name   Signature               0       5     0  this   LSumPlusTest;  public static void main(java.lang.String[]);    flags: ACC_PUBLIC, ACC_STATIC    Code:      stack=3, locals=5, args_size=1         0: iconst_1               1: istore_1      #0,1相当于是执行a=1         2: iconst_1               3: istore_2      #2,3相当于是执行b=1         4: iconst_1               5: istore_3      #4,5相当于是执行c=1         6: iconst_1               7: istore_4	  #6,7相当于是执行d=1         9: iinc          1, 1		#相当于执行a的值+1        12: iinc          2, 1		#相当于执行b的值+1        15: iload_3       			#将c的值放入栈顶        16: iinc          3, 1		#执行c的值+1        19: istore_3      			#再将栈顶的值赋值给c,此时即c=1        20: iinc          4, 1		#相当于是执行d的值+1        23: iload         4			#把d的值放置于栈顶        25: istore        4			#然后将栈顶的值付给d这个变量,此时d=2		......	  LocalVariableTable:        Start  Length  Slot  Name   Signature               0      81     0  args   [Ljava/lang/String;               2      79     1     a   I               4      77     2     b   I               6      75     3     c   I               9      72     4     d   I}