CAS、乐观锁、悲观锁

原文出处

CAS 是一种有名的无锁算法,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程阻塞的情况下实现变量同步。

  • CAS(Compare And Swap) 比较并替换,是线程并发运行时用到的一种技术
  • CAS是原子操作,保证并发安全,而不能保证并发同步
  • CAS是CPU的一个指令(需要JNI调用Native方法,才能调用CPU的指令)
  • CAS是非阻塞的、轻量级的乐观锁

CAS的优缺点

优点:

  • 非阻塞的轻量级的乐观锁,通过CPU指令实现,在资源竞争不激烈的情况下性能高,相比synchronized重量锁,synchronized会进行比较复杂的加锁、解锁和唤醒操作。

缺点:

  • ABA问题
  • 自旋时间过长,消耗CPU资源,如果资源竞争激烈,多线程自旋长时间消耗资源

悲观锁

synchronized 是一个悲观锁,是一种独占锁。会导致其他所有需要锁的线程挂起,等待持有锁的线程释放锁。

乐观锁

严格意义上不是锁,是通过原子性保证数据的同步。比如数据库的乐观锁就是通过数据版本控制实现。

悲观锁和乐观锁使用
像乐观锁适用于写比较少的情况下(多读场景),即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的吞吐量。但如果是多写的情况,一般会经常发生冲突,这就会导致CAS算法会不断的进行retry,这样反倒是降低了性能,所以一般多写的场景下用悲观锁就比较合适。
posted @ 2020-10-15 10:17  衰草寒烟  阅读(403)  评论(0编辑  收藏  举报