volatile关键字的本质是告诉jvm,该变量在寄存器中的值是不确定的,需要在主存中读取,而synchronized关键字是锁住当前变量,只有当前线程可以访问,其他线程等待。volatile关键字的作用:保证变量的可见性和防止指令重排序。
1. volatile只能作用于变量,而synchronized可以作用于变量、方法和代码块
2. 多线程访问volatile不会发生阻塞,而synchronized关键字可能发生阻塞。
3. volatile能够保证数据的可见性,就是在多个线程之间是可见的,不能保证原子性,而synchronized关键字都可以保证。
4. volatile关键字主要解决的是多个线程之间的可见性,而synchronized关键字保证的是多个线程访问资源的同步性。