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精品面试题