volatitle原理与应用
说到Java多线程编程就不得不说volatitle这个关键词。volatitle是一种和sychronized差不多功用的东东,是轻量级的synchronized,它能保证共享变量在多处理器开发的“可见性”。这里的“可见性”指的是当两个线程在共享一个变量x的时候,由于缓存的问题,两个线程的CPU核会各有一份x,如果没有用volatitle的话,当我们在其中一个线程中修改x的值,另一个线程将访问的是缓存中的值,并不是修改后的值。这在并发编程中就会出现一些意料不到的情况。那么volatitle是如何实现保证“可见性”的呢
volatitle变量编译后会添加一个Lock指令
Lock指令在执行时多核处理器会引发两件事:
(1)将当前处理器缓存行的数据写回到系统内存
(2)这个写回内存的操作会使其他CPU里缓存了该内存地址的数据无效。
并且在这两件事上,系统使用了锁锁定这块内存区域的缓存,并使用缓存一致性机制来确保修改的原子性,缓存一致性机制会阻止同时修改由两个以上处理器缓存的内存区域数据。
根据这两件事,我们就可以看到volatitle为什么可以保证共享变量的“可见性”了。
在多核处理器系统中,处理器能够嗅探其他处理器访问系统内存和他们的内部缓存。简单地说就是如果一个处理器发现其他处理器正在写一个共享数据的内存的话,那么这个处理器将会使自己内部的这个变量的缓存无效化,下次再访问这个缓存的时候就会强制去读内存,而不是直接读缓存。