volatile是轻量级的读锁,它在多处理器开发中保证了共享变量的可见性
volatile保证读的准确性,只能修饰属性(变量)
public class liN {
private volatile int a = 1;
}
可见性:在多线程高速缓存时,一个线程修改后,volatile将其他线程也进行修改,保证修改后其他线程读到的数据是修改后的
如果一个字段被声明成volatile,java线程模型确保所有线程看到这个变量的值是一致的
有volatile变量修饰的共享变量进行写操作时会多出一行汇编代码,通过查IA-32架构软件开发者收手册可知,Lock前缀的命令在多核处理器下会引发两件事情:
1)将当前处理器缓存行的数据写回到系统内存。
2)这个写回内存的操作会使在其他CPU里缓存了该内存地址的数据无效。
在多处理器下,为了保证各个处理器的缓存是一致的,就会实现缓存一 致性协议,每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当 处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置成无效状 态,当处理器对这个数据进行修改操作的时候,会重新从系统内存中把数据读到处理器缓存 里。
volatile的实现原则:
1)Lock前缀指令会引起处理器缓存回写到内存中,缓存一致性机制会阻止同时修改两个以上处理器缓存的内存区域数据。
2)一个处理器的缓存回写到内存会导致其他处理器的缓存无效,处理器使用嗅探技术保证它的内部缓存、系统内存和其他处理器的缓存的数据在总线上保持一致
除了volatile,Java并发编程中应用较多的 是synchronized