volatile关键字,Java并发的最轻量级实现,保证该变量的可见性,即一个线程修改该变量以后,会立即将该变量更新到主内存中,这样其他线程读取时,会从内存中读取新的值。
但是volatile不能保证有序性,例如:
如果我们对一个volatile修饰的变量进行多线程下的自增操作,还是会出现线程安全问题。根本原因在于volatile关键字无法对自增进行安全性修饰,因为自增分为三步,读取-》+1-》写入。中间多个线程同时执行+1操作,还是会出现线程安全性问题。
与使用synchronized相比,声明一个volatile字段的区别在于没有涉及到锁操作。由于没有涉及到锁操作,声明volatile字段很可能比使用同步的开销更低,至少不会更高。但如果在方法内频繁访问volatile字段,很可能导致更低的性能,这时还不如锁住整个方法。
当只有一个线程可以修改字段的值,其它线程可以随时读取,那么把字段声明为volatile是合理的。
但是volatile不能保证有序性,例如:
如果我们对一个volatile修饰的变量进行多线程下的自增操作,还是会出现线程安全问题。根本原因在于volatile关键字无法对自增进行安全性修饰,因为自增分为三步,读取-》+1-》写入。中间多个线程同时执行+1操作,还是会出现线程安全性问题。
与使用synchronized相比,声明一个volatile字段的区别在于没有涉及到锁操作。由于没有涉及到锁操作,声明volatile字段很可能比使用同步的开销更低,至少不会更高。但如果在方法内频繁访问volatile字段,很可能导致更低的性能,这时还不如锁住整个方法。
当只有一个线程可以修改字段的值,其它线程可以随时读取,那么把字段声明为volatile是合理的。