一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰后,会保证不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量后是立即可见的。另外会禁止指令重排序。
volatile本质是告诉jvm当前变量在寄存器中的值不确定,需要从主存中读取。
synchronized是锁定当前变量,只有当前线程可以访问该变量。
1.volatile仅能使用在变量级别:
synchronized则是用在变量,方法,类级别的
2.volatile仅能实现变量修改的可见性,并不能保证原子性;
synchronized可以保证变量修改的可见性和原子性
3.volatile不会造成线程的阻塞
synchronized可能造成线程的阻塞
4.volatile标记的变量不会被编译器优化
synchronized标记的变量会被编译器优化