CAS是一种乐观锁,相对的那就要提到悲观锁。
悲观锁认为每次去拿取数据时都认为会被人修改,所以每次取数据都会上锁不允许别人访问;
乐观锁认为每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断—下是否被更新。
悲观锁的实现方式就是Java中的synchronized等独占锁,乐观锁的实现方式是添加版本号字段或CAS算法等。
CAS也被成为无锁机制,通过原子性的操作在多线程环境下实现同步和线程安全。
由于上锁后会使得线程阻塞是程序运行性能降低,甚至导致死锁问题等,所以通过CAS乐观锁能一定程度上避免这些问题。
实现原理:
根据内存地址V读取变量的当前值→
将当前值与期望值A进行比较,如果相等则继续,如果不相等则返回操作失败→
如果相等则将变量的值更新为新值B
CAS的实现方法有:
compareAndSwapObject()、compareAndSwapInt()、compareAndSwapLong()等
CAS乐观锁机制的实现需要保证操作的原子性和可见性,同时要避免ABA问题的出现,因为CAS无法判断旧期望值A和内存V取值是同一个版本(无法确保内存数值未更改过还是已经进行更改又有操作将其变回了同样数值)