花公子丶 2016-08-08 02:44 采纳率: 50%
浏览 1183
已采纳

在Java并发中,对象尚未被完全创建的问题

麻烦帮忙看一下,为什么会有n!=n这种现象?
图片说明

  • 写回答

4条回答 默认 最新

  • 花公子丶 2016-09-05 03:23
    关注

    java虚拟机性能的提高,有一部分得归功于对代码的重排序。在if(n!=n)中,其实存在控制依赖关系。这里有几个操作:
    一、读取左边的n值,
    二、读取右边的n值,
    三、进行不等比较,
    四、把不等比较的结果给if。
    上面四个操作,由于依赖关系,有一二先于三,三先于四这样的执行顺序。而一二之间没有依赖关系,所以一二可以重排序。
    所以可能会这样:
    temp1=n,
    temp2=n,
    flag=temp1!=temp2
    if(flag)
    而执行上面四个操作的时候,可能另一个线程正在执行new操作,由于重排序,这个线程可能在对象未完全构造完毕就把对象的引用给发布出去了。
    于是temp1=n操作可能发生在对象构造完毕前,此时可能构造器里面的this.n=n还未执行,所以此时的n可能是0,而不是传给构造函数的那个参数的值,而temp2=n则可能发生在对象构造完毕之后,此时的n是传给构造函数参数的值,于是最后就看到不一致的结果,导致n!=n为true

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 有赏,i卡绘世画不出
  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码