首先,让我们来看看这行代码是什么!
可能有很多人会认为,输出结果就是i=1、i=2、i=3、i=4如此直到100,只可惜,这样子的无序输出是错误的。
如果不信,可以照着这个图片中的代码打出来,真正的输出结果可能会是这样:i=2、i=3、i=4、i=4、i=5这样子,或者相邻两个数打印出来的是一样的。
如果有想要学习Java的程序员,可来我们的java技术学习扣qun哦:86327,0610里面免费送java的视频教程噢!为什么会出现这样的情况?那是因为,在代码中,变量i是一个integer对象,而当代码中的两个线程执行的时候,i++的实际逻辑却是这样的:i = Integer.valueOf(i.intValue + 1);
Integer.valueOf每次返回的时候,都是一个新的Integer对象,所以,打印出来的并不是你想要的结果。
调出class文件,通过jdk自带的javap命令工具,对 MyRunnable.class 进行分析,在虚拟机中可以看着i++的执行原理。
其实这个逻辑,用一句简短的代码表示出来,就是i = Integer.valueOf(i.intValue + 1);”
再看一下查看Integer的源码,发现 Integer.valueOf 每次都是新对象。
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);}
真相大白,程序执行的真相并不是你想想中的那样,你想让程序做什么就做什么,这其中可能含有你不知道的一些问题,这就是为什么说Java程序员到了一定的地步,需要去看源码的原因,这能够帮助你更好得了解代码的编译机制,有利于你的职业成长。
网友评论