CAS:Compare And Swap,比较并替换。Synchronized属于悲观锁,CAS属于乐观锁。
原理:使用内存地址V、旧的预期值A、要修改的新值B三个基本操作数,要更新一个变量时,只有当变量的预期值A和内存地址V当中的实际值相同时,才会将地址V对应的值修改为B。
使用场景:java中的Atomic系列类、Lock系列类的底层实现;java1.6以上版本,Synchronized转变为重量级之前,也会采用CAS。
缺点:1、CPU开销大:高并发时,许多线程反复尝试更新一个变量,却一直更新不成功,循环往复,cpu开销大
2、CAS只能保证一个变量的原子性,无法保证一个代码块或多个变量的原子性
3、ABA问题,解决办法是除了比较预期值和内存地址的实际值是否相同,还要加个版本号的比较,java中的AtomicStampedReference类实现了用版本号比较的CAS机制。