据说这道JAVA基础题,面试中给出正确答案的人数不到32%

发布时间:2019-11-20 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了据说这道JAVA基础题,面试中给出正确答案的人数不到32%脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

先抛出问题 - “这段程序的运行结果是什么

据说这道JAVA基础题,面试中给出正确答案的人数不到32%
题目- 全部代码,仔细审题哦
期待的运行结果:
i=1
i=2
i=4
i=3
...
..
i=100
无序输出 i=1到1=100。可惜,这是错误的答案。

实际运行结果中,可能出现部分值没有被输出,部分值被重复输出,如下:

i = 2
i = 2
i = 3
...
i = 100
这里仅列举了一种,你可以自己尝试运行几次。
原因分析

代码中 i 变量,是一个Integer对象,当代码中两个线程执行 i++时,

实际运行时的 i++ 的实现逻辑是这样的:

i = Integer.valueOf(i.intValue() + 1);
而Integer.valueOf每次是返回一个新的Integer对象,所以,我们的synchronized实际上没有起到你预想中的效果。

我是如何发现这个实现内幕的呢?

底层原理分析

1、 分析编译后的MyRunnable.class文件,发现 i++ 在虚拟机中的执行原理。

通过jdk自带javap命令工具,对 MyRunnable.class 进行分析

javap -v MyRunnable.class
可以看到输出内容中(如下图),JVM执行 i++ 的内部逻辑。

据说这道JAVA基础题,面试中给出正确答案的人数不到32%
使用javap命令分析class的结果截图
这个逻辑,通过代码表达出来就是这句“i = Integer.valueOf(i.intValue() + 1);”

2、 查看Integer的码,发现 Integer.valueOf 每次都是新对象。

/* Integer源码取自jdk1.8 /
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-integerCache.low)];
return new Integer(i);
}
写在最后

真相大白了,你懂了嘛? 可以分享出去让更多人知道

在学习JAVA的过程中,我真正体会到了系统性学习的重要性,现在我每个月都有学习目标,不再像以前那样,看到什么就学什么了,这样做让我明显感觉到了自己的提升

脚本宝典总结

以上是脚本宝典为你收集整理的据说这道JAVA基础题,面试中给出正确答案的人数不到32%全部内容,希望文章能够帮你解决据说这道JAVA基础题,面试中给出正确答案的人数不到32%所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。