线程同步之synchronized volatile ReentrantLock CAS总结

1,017 阅读1分钟

synchronized

  • 同步锁自己控制放行或者不放行
  • 修饰的静态方法作用于这个类的所有对象
  • 修饰的类作用于这个类的所有对象

volatile

  • 不需要加锁,修改之后立即内存可见,直接存储在内存不需要进入到cpu
  • 变量修饰符,仅仅可以用户变量,synchronized可以作用于变量和方法
  • 标记的变量不会被编译器优化

ReentrantLock

  • 多重锁,同意个线程可以调用多次锁形成多层锁,同一个线程进入一次,锁的计数器都自增1
  • synchronized 是jvm层面实现的,reentrantlock是API层面的实现
  • synchronized比较简洁,Reentrantlock需要手动处理

CAS(Compare-and-Swap)

  • CAS指令需要3个操作数,内存地址,旧的预期,新值
  • 存在ABA问题 AtomicStampedReference来解决ABA问题
  • 自旋CAS(不成功,就一直循环执行,直到成功==)如果长时间不成功,会给CPU带来非常大的执行开