Java之volatile的作用 && volatile与synchronized的区别

为了提高程序的运行效率,编译器会自动对其进行优化,把经常被访问的变量缓存起来,程序在读取这个变量时会直接从缓存中读取,而不会从内存中读取

当遇到多线程时,变量的值可能因为别的线程而改变,而缓存的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致

volatile是用来修饰被不同线程访问和修改的变量
被volatile修饰的变量,系统每次用到它时都是直接从对应的内存中提取,而不会利用缓存
使用了volatile后,所有线程在任何时候所看到变量的值都是相同的

需要注意的是:
volatile只能保证可见性,不能保证操作的原子性
而synchronized既可以保证可见性,又可以保证原子性
所以说,volatile不能代替synchronized,

最后,volatile与synchronized的区别如下:

  1. volatile用来修饰变量的,保证直接读取内存的值;而synchronized是锁住当前变量,保证同一时刻只有一个线程访问该变量
  2. volatile只能用来修改变量,而synchronized可以用来修饰变量和方法
  3. volatile只能保证可见性,而synchronized可以保证可见性和原子性
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章