https://cloud.tencent.com/developer/article/1611769

  1. synchronized 保证内存可见性和操作的原子性。
  2. volatile 只能保证内存可见性
  3. volatile 不需要加锁,比 synchronized 更轻量级,并不会阻塞线程(volatile 不会造成线程的阻塞;synchronized 可能会造成线程的阻塞)
  4. volatile 标记的变量不会被编译器优化,而 synchronized 标记的变量可以被编译器优化(如编译器重排序的优化)
  5. volatile 是变量修饰符,仅能用于变量,而 synchronized 是一个方法或块的修饰符。

volatile 本质是在告诉 JVM 当前变量在寄存器中的值是不确定的,使用前,需要先从主存中读取,因此可以实现可见性。而对n=n+1,n++等操作时,volatile关键字将失效,不能起到像 synchronized 一样的线程同步(原子性)的效果。

在可见性上,synchronized和volatile的区别?