今天面试的时候被一个问题卡主了,就是关于Volatile的问题:
Q: 请简单介绍下Volatile这个关键字;
A: Volatile字段是保证了数据的可见性,但是不保证原子性,他是添加内存屏障来保证的,还有。。。。。;
Q:假如有三个线程;但是你说的是将内存中的值进行读取;读取到的值是最新的,但是这个是怎么实现的呢?因为你只是改变的是自己的线程;
A:(瞬间大脑短路,应变能力太差);想想;是这个样的,他改变了自己内存的值,但是将自己的内存的值刷新到住内存中;并且通知其他的线程,并且令其他的线程的值无效;
Q: 他是怎么通知的呢?
A:(我去,这个写代码会用到吗?) 我死了。
回来之后看看关于这个问题,原来问的是关于缓存一致性协议的问题;
具体的流程是这样的;
1.将当前处理器缓存行的数据写回到系统内存;
2.这个写会内存操作会使得在其他CPU里面缓存了该内存的地址无效。
如果对申明了Volatile的变量进行操作,JVM就会发送一条LOCK前缀的指令,将这个变量所造缓存行的数据写回到内存。但是,就算是写回内存,如果其他的内存的值还是旧的,那么操作计算就是有问题的,所以,在多处理器下,为了保证各个处理器的缓存是一致的,就会实现缓存一致性协议,每个处理器通过嗅探在总线上的数据来检查自己缓存的值是不是过期了,当处理器发现自己的缓存行为对应的内存地址被修改,就会将处理器缓存行设置成无效状态,当处理器对这个数据进行修改的时候,就会重新从系统内存中把数据读取到缓存行里。
面试失败,打完收工!
网友评论