- Synchronized保证内存可见性、有序性和操作的原子性
- Volatile只能保证内存可见性和有序性
- Volatile不需要加锁,比Synchronized更轻量级,并不会阻塞线程(volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。)
- volatile标记的变量不会被编译器优化,而synchronized标记的变量可以被编译器优化(如编译器重排序的优化).
- volatile是变量修饰符,仅能用于变量,而synchronized是一个方法或块的修饰符。
volatile使用场景:
简化代码的实现以及对同步策略的验证时,才应该使用它们。
确保它们自身状态的可见性;
确保它们所引用对象的状态的可见性;
标识一些重要的程序生命周期事件的发生(例如:初始化和关闭)
注意:如果在验证正确性时需要对可见性进行复杂的判断,那么就不要使用volatile变量。