大企业中,Java面试官最爱问的问题集锦

101 阅读1分钟

Java编程语言是一种简单、面向对象、分布式、解释型、健壮安全、与系统无关、可移植、高性能、多线程和动态的语言。如今Java已经广泛应用于各个领域的编程开发。

Java

面试官:说的还可以,那你知道volatile底层的实现机制?

如果把加入volatile关键字的代码和未加入volatile关键字的代码都生成汇编代码,会发现加入volatile关键字的代码会多出一个lock前缀指令。

lock前缀指令实际相当于一个内存屏障,内存屏障提供了以下功能:

1.重排序时不能把后面的指令重排序到内存屏障之前的位置2.使得本CPU的Cache写入内存3.写入动作也会引起别的CPU或者别的内核无效化其Cache,相当于让新写入的值对别的线程可见。

面试官:你在哪里会使用到volatile,举两个例子呢?

状态量标记,就如上面对flag的标记,我重新提一下:

 inta=0;

    volatileboolflag=false;

    publicvoidwrite(){

    a=2;//1

    flag=true;//2

    }

    publicvoidmultiply(){

    if(flag){//3

    intret=a*a;//4

    }

    }

    这种对变量的读写操作,标记为volatile可以保证修改对线程立刻可见。比synchronized,Lock有一定的效率提升。

    2.单例模式的实现,典型的双重检查锁定(DCL)

    classSingleton{

    privatevolatilestaticSingletoninstance=null;

    privateSingleton(){

    }

    publicstaticSingletongetInstance(){

    if(instance==null){

    synchronized(Singleton.class){

    if(instance==null)

    instance=newSingleton();

    }

    }

    returninstance;

    }

    }

这是一种懒汉的单例模式,使用时才创建对象,而且为了避免初始化操作的指令重排序,给instance加上了volatile。

扫码免费领取Java精品面试题 在这里插入图片描述