1. 编译器的优化
在本次线程内, 当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器中取值;当变量值在本线程里改变时,会同时把变量的新值copy到该寄存器中,以便保持一致。
当变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致。
当该寄存器在因别的线程等而改变了值,原变量的值不会改变,从而造成应用程序读取的值和实际的变量值不一致。
2.volatile应该解释为“直接存取原始内存地址”比较合适,“易变的”这种解释简直有点误导人。
加上volatile 实际上就直接从内存中读取,避免了被编译器优化造成的数据不一致性!
注意:频繁地使用volatile很可能会增加代码尺寸和降低性能,因此要合理的使用volatile。