volatile : 告诉jvm当前变量在内存中是不确定的需要从主内存中读取;
synchronized : 锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞;
两者对比 :
synchronized | volatile | |
---|---|---|
使用位置 | 变量,方法,类 | 变量 |
作用 | 保证变量的修改可见性和原子性 | 保证变量的修改可见性 |
阻塞线程 | 可能会造成线程堵塞 | 不会造成线程阻塞 |
标记的变量可以被编译器优化 | 不能被编译器优化 |
修改可见性: 当一个线程修改了变量,其他线程能否及时发现该变量被修改了,实现强一致性的前提;