volatile是并发编程中重要的角色之一,通常会被比作轻量级的synchronized。volatile有两大特性:可见性和有序性。
本文主要介绍volatile的可见性原理。
被volatile修饰的变量通过编译器编译成汇编指令后,指令当中会出现一个Lock前缀。而这个lock一般的作用就是保证数据的一致性,执行这条指令时一般有两个动作:1、将缓存行的数据写回到内存当中2、使其他处理器中缓存了该内存地址的缓存行无效。
我们知道处理器运作的时候一般都是操作缓存而不是直接操作内存,同时,多线程情况下,每个线程的栈空间都是私有的,意味着每个线程对同一个对象操作时,会先将内存中的数据拷贝到自己的缓存区再进行写操作。如果某个线程先完成了写操作并且要将数据同步到内存中,但是其他内存不知道,到最后其他线程就会覆盖前面线程的操作。而Lock指令执行时,会实现缓存一致性协议。1、每个处理器可以通过嗅探在总线上传播的数据检查自己的缓存的内存地址是否被修改,如果被修改了就会将当前处理器的缓存行设置为无效,即缓存行的数据失效。当下一次访问内存时强制执行缓存填充。2、内存独占或锁缓存,内存独占及锁总线,其他cpu无法访问总线意味着无法访问系统内存;而有的处理器为了减少开销,会锁缓存,当其中一个线程操作共享变量时,其他线程无法对缓存行进行操作,需等待写操作写会内存。