CAS、乐观锁、悲观锁
CAS 是一种有名的无锁算法,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程阻塞的情况下实现变量同步。
- CAS(Compare And Swap) 比较并替换,是线程并发运行时用到的一种技术
- CAS是原子操作,保证并发安全,而不能保证并发同步
- CAS是CPU的一个指令(需要JNI调用Native方法,才能调用CPU的指令)
- CAS是非阻塞的、轻量级的乐观锁
CAS的优缺点
优点:
- 非阻塞的轻量级的乐观锁,通过CPU指令实现,在资源竞争不激烈的情况下性能高,相比synchronized重量锁,synchronized会进行比较复杂的加锁、解锁和唤醒操作。
缺点:
- ABA问题
- 自旋时间过长,消耗CPU资源,如果资源竞争激烈,多线程自旋长时间消耗资源
悲观锁
synchronized 是一个悲观锁,是一种独占锁。会导致其他所有需要锁的线程挂起,等待持有锁的线程释放锁。
乐观锁
严格意义上不是锁,是通过原子性保证数据的同步。比如数据库的乐观锁就是通过数据版本控制实现。
悲观锁和乐观锁使用
像乐观锁适用于写比较少的情况下(多读场景),即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的吞吐量。但如果是多写的情况,一般会经常发生冲突,这就会导致CAS算法会不断的进行retry,这样反倒是降低了性能,所以一般多写的场景下用悲观锁就比较合适。