volatile:
不会造成线程堵塞
不能保证原子性,能保证原子性和可见性
只能用于变量
volatile标记的变量不会被编译器优化
volatile本质是在告诉jvm当前变量在寄存器中的值是不确定的,需要从主存中读取
synchronized:
能保证原子性
会造成线程堵塞
可以使用在变量和方法
synchronized标记的变量可以被编译器优化.
synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住.
相同:
都是java中的关键字,能保证变量的可见性