什么是CAS
简介
CAS是原子类的底层原理,同时也是乐观锁的原理,全称是Compare-And-Swap,“比较并交换”,他是一种思想、算法。
特点:可以避免使用互斥锁,当多个线程同时使用CAS更新同一个变量时,只有其中一个线程能操作成功,其他线程更新失败,更新失败的线程不会被阻塞。
思路
CAS实现的无锁算法是一种协商机制,互斥锁不存在协商机制,大家都会尝试抢占资源,利用CAS和利用互斥锁都可以保证并发安全。
CAS的缺点
ABA问题
决定CAS是否进行swap的判断标准是”当前的值和预期的值是否一致“。CAS检查的并不是值有没有发生变化,而是去比较这当前的值和预期值是不是相等。
解决方法:添加一个版本号,标记修改的版本。
自旋时间过长
单次的CAS不一定能执行成功,往往是配合循环来实现的,有时甚至是死循环,不停地进行重试,直到线程竞争不激烈的时候,才能修改成功。
所以在高并发的时候CAS的效率是不高的,因为可能比较一直是被修改的。
范围不能灵活控制
执行CAS时是针对某一个,而不是多个共享变量的。这个变量可能是Integer类型,也有可能是Long类型、对象类型等等。如果想对多个对象同时进行CAS操作并想保证线程安全的话,是比较困难的。
解决方法:利用一个新的类,整合刚才这一组共享变量,新的类中的多个成员变量就是刚才的那多个共享变量,再利用atomic包中的AtomicReference来把这个新对象整体进行CAS操作就可以保证线程安全