1. Synchronized保证内存可见性、有序性和操作的原子性
    2. Volatile只能保证内存可见性和有序性
    3. Volatile不需要加锁,比Synchronized更轻量级,并不会阻塞线程(volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。)
    4. volatile标记的变量不会被编译器优化,而synchronized标记的变量可以被编译器优化(如编译器重排序的优化).
    5. volatile是变量修饰符,仅能用于变量,而synchronized是一个方法的修饰符。

    volatile使用场景:
    简化代码的实现以及对同步策略的验证时,才应该使用它们。
    确保它们自身状态的可见性;
    确保它们所引用对象的状态的可见性;
    标识一些重要的程序生命周期事件的发生(例如:初始化和关闭)

    注意:如果在验证正确性时需要对可见性进行复杂的判断,那么就不要使用volatile变量。