#Java程序员的一段基础逻辑代码!却有很多人的结果是错的

首先,让我们来看看这行代码是什么!

如果有想学习java的程序员,可来我的java学习扣qun:943111692,免费送java的视频教程噢!我每晚上8点还会在群内直播讲解Java知识,欢迎大家前来学习哦。

可能有很多人会认为,输出结果就是i=1、i=2、i=3、i=4如此直到100,只可惜,这样子的无序输出是错误的。

如果不信,可以照着这个图片中的代码打出来,真正的输出结果可能会是这样:i=2、i=3、i=4、i=4、i=5这样子,或者相邻两个数打印出来的是一样的。

为什么会出现这样的情况?那是因为,在代码中,变量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程序员到了一定的地步,需要去看源码的原因,这能够帮助你更好得了解代码的编译机制,有利于你的职业成长。

猜你喜欢

转载自blog.csdn.net/qq_43202482/article/details/86523127