分享

面试 尚硅谷

 一本正经地胡闹 2020-11-16
  1. volatile

    1)可见性。不能保证原子性。

    2)禁止指令重排序。编译器,cpu,指令之间没有依赖关系的话,会将指令重新排序。

    例如:Product p = new Product();这行代码分为以下3个步骤(伪代码)。

    memory=allocate() 1.开内存空间

    initialize(memory)   2.初始化

    instance=memory   3.将instance指向memory内存地址,到这一步instance!=null

    步骤2和步骤3没有依赖关系,会有指令重排。多线程下,单例模式需要注意这一点。

private static Product product;

public static Product getInstance(){

      if(product == null)

             product = new Product();

      return product;

}

  1. javap

    1)const,load。在class中,这两步是对栈顶进行改值的操作。没有这两步,栈顶的值没变,用的是之前的值。

    这可以解释为什么i=i++为什么是0,i=++i则是1。详细如下。

    https://blog.csdn.net/junsure2012/article/details/7099222

    https://blog.csdn.net/luckyp/article/details/4255353

    store是将栈顶的值给变量,例如下面最后两步

    例如:

int i=10;

i=i+3;

int j=i;


bipush        10

istore_1

iload_1

iconst_3

iadd

istore_1

iload_1     加载到栈顶

istore_2    给第2个变量

return


.....

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多