美文网首页程序员我爱编程
JAVA基础题,面试中给出正确答案的人数不到32%

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

作者: 启示录是真的 | 来源:发表于2018-05-27 16:07 被阅读303次

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

    题目- 全部代码,仔细审题哦

    期待的运行结果:

    i=1

    i=2

    i=4

    i=3

    ...

    ..说实话我是一名搬运工,我知道你们都不缺这样的视频教程,但是我知道你们都是java的爱好者,如果想系统学习的话可以来找我,我院5月12号和我阿里云签订合作协议,具体协议来问我。每天2节公开课注意都是免费的,听公开课比你看视频要进步的快收获的多,还有大神老司 机解答问题,想认真学习+Java学习交流裙:【 一三三,九三零,六九三】,无论你是大牛还是小白,是想转行还是想入行都可以来了解,一起进步一起学习!裙内有开发工具,很多干货和教程资料给你

    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++ 的内部逻辑。

    使用javap命令分析class的结果截图

    说实话我是一名搬运工,我知道你们都不缺这样的视频教程,但是我知道你们都是java的爱好者,如果想系统学习的话可以来找我,我院5月12号和我阿里云签订合作协议,具体协议来问我。每天2节公开课注意都是免费的,听公开课比你看视频要进步的快收获的多,还有大神老司 机解答问题,想认真学习+Java学习交流裙:【 一三三,九三零,六九三】,无论你是大牛还是小白,是想转行还是想入行都可以来了解,一起进步一起学习!裙内有开发工具,很多干货和教程资料给你

    这个逻辑,通过代码表达出来就是这句“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知识给大家。希望你们监督我

    相关文章

      网友评论

        本文标题:JAVA基础题,面试中给出正确答案的人数不到32%

        本文链接:https://www.haomeiwen.com/subject/lqgbjftx.html