1、CAS是乐观锁,在concurrentHashmap中的putval方法中会用到CAS
非阻塞的实现CAS:CAS指令需要3个操作数,分别是内存地址(在JAVA中理解为变量的内存地址,用V表示),旧的预期值(用A表示),新值(B)。CAS指令执行时,当且仅当V处的值符合旧预期值A时,处理器用B更新A值,否则它就不执行更新,但是无论是否更新了V处的值,都会返回V的旧值,上述的处理过程是一个原子操作。
CAS缺点 :ABA问题:因为CAS需要在操作值的时候检查下值有没有发生变化,如果没有发生变化则更新,但是一个值原来是A,变成B,又变成A,那么使用CAS进行检查时会发现它的值没有发生变化,但是实际上却变化了。
ABA问题的解决思路就是使用版本号。在变量前面追加版本号,每次变量更新的时候把版本号加一,那么A-B-A就变成了1A-2B-3C。
**2、CAS还有可能引发的问题**:
1.ABA问题;
2.不停的自旋等待,造成处理器资源浪费; (可以通过加sleep+自旋,这样可以让线程进入睡眠)
3.CAS只能保证对一个变量操作的原子性,而不能保证对代码块操作的原子性
当许多线程都可以进入一个方法内对变量进行修改的时候,由于线程数量过于密集,导致大部分进程都无法成功修改变量的值,白白在那里循环消耗着资源。所以java对它进行了优化引入了一个cell[]数组,比如有5个线程