1. CAS实现原理
CAS是Compare And Swap的缩写,意思就是比较并交换。它是无锁化的实现,是经典的乐观锁。
synchronized是一种悲观锁,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。乐观锁就是不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。乐观锁的机制就是CAS。
CAS操作很简单,它包含三个操作数:内存地址V、预期原值A、新值B。
先比较内存地址V处的值和预期原值A是否相等,如果相等就将内存地址V处更新为新值B。
在配合循环使用时,若CAS操作失败,会循环执行或到达某个终止处。此操作配合循环使用时,又称为自旋锁的实现方式。
2. CAS存在的问题
① ABA问题 解决办法: - 加时间戳 - 加版本号
② 循环开销大 CAS是乐观锁,如果线程比较多,资源抢占激烈,命中率低的情况下,不断的循环会不断的消耗资源。实际上,可以设置最大循环数,达到最大循环数还没有占有资源就自动放弃,避免无限的循环。
③ 只能保证一个共享变量的原子操作。