挑战面试题一
所有面试题都是从网上收集的,知识面比较广,可能有重复的题目。所有的答案都是我自己查阅资料加上自己的理解所写的,难免有不详之处,希望大家不吝赐教! volatile的底层如何实现,怎么就能保住可见性了?volatile关键字修饰的变量可以确保内存可见性,禁止指令重排序。volatile修饰的变量不允许线程内存cache缓存和重排序,线程读取数据的时候直接读取内存,同时volatile不会对变量加锁,因此性能会比synchronized好。还有一种说法是:读取一个volatile关键字会使相应的处理器执行刷新处理器缓存的动作,写一个volatile关键字会使得相应的处理器执行冲刷处理器缓存的动作。 拓展:假如我们有一个使用volatile的变量instance.有如下代码: 1instance = new Singleton(); 它的汇编代码如下: 120x01a3de1d: movb $0x0,0x1104800(%esi);0x01a3de24: lock addl $0x0,(%esp); //使用volatile修饰的变量会多这行 使用lock前缀的指令会引发两件事情: 将当前处理器缓存含的数据写回到系统内存 这个写回内存的操作回引起在其它CPU里缓存了该内存地址的数据无效
