https://cloud.tencent.com/developer/article/1611769
- synchronized 保证内存可见性和操作的原子性。
- volatile 只能保证内存可见性
- volatile 不需要加锁,比 synchronized 更轻量级,并不会阻塞线程(volatile 不会造成线程的阻塞;synchronized 可能会造成线程的阻塞)
- volatile 标记的变量不会被编译器优化,而 synchronized 标记的变量可以被编译器优化(如编译器重排序的优化)
- volatile 是变量修饰符,仅能用于变量,而 synchronized 是一个方法或块的修饰符。
volatile 本质是在告诉 JVM 当前变量在寄存器中的值是不确定的,使用前,需要先从主存中读取,因此可以实现可见性。而对n=n+1,n++等操作时,volatile关键字将失效,不能起到像 synchronized 一样的线程同步(原子性)的效果。
在可见性上,synchronized和volatile的区别?