对Java中volatile修饰符的理解

由于CPU的执行速度要高于内存读取数据的速度,所以将需要运算的数据复制一份到CPU的高速缓存中,也就是给当前运行线程的运行内存中放入副本。运算结束后再将高速缓冲中的数据刷新到主存中。

引出问题

  • 在并发环境下,数据运算之后刷新到主存的时间是不确定的,所以会导致其他线程运行时候可能操作的还是旧值。
  • 处理器为了保证程序运行的效率,处理指令的顺序可能不会按代码的先后顺序执行,但是它还是会依靠计算结果的依赖性保证指令重排序后运算的结果与原来相同。

处理问题

  • 可见性:第一个问题涉及到数据的可见性,被 volatile修饰的变量被运算之后会立即刷新到主存,这样其他线程就会从主存中取到被运算后的值,保证了可见性;
  • 有序性:第二个问题是运行程序的有序性,被volatile修饰的变量不会被重排序,也就是说处理器会按照代码的先后顺序来执行指令,不会进行指令优化。

与同步代码块synchronized的区别
synchronized能保证原子性操作,而volatile不能保证原子性。

猜你喜欢

转载自blog.csdn.net/mashaokang1314/article/details/84747958