CAS,CompareAndSet,说白了它就是一个方法吧。
有些问题可能会混淆,在此记录下:
1、++i,这样的操作其实并不是线程安全的;
2、有关AtomicInteger的incrementAndGet方法其实也不是绝对能获得预期值的,因为可能有ABA问题;
3、好多文章都说CAS是不存在锁的,但是个人认为就看你怎么理解这个锁了,CAS底层实现挖掘到汇编语言,里面还是有锁的,只不过这个锁是针对cpu,操作系统层面的;
4、incrementAndGet这个方法是可并发的,但是CompareAndSet应该是单线程不存在并发的,原因估计就是因为第三条。
- /**
- * Atomically increments by one the current value.
- *
- * @return the updated value
- */
- public final int incrementAndGet() {
- for (;;) {
- int current = get();
- int next = current + 1;
- if (compareAndSet(current, next))
- return next;
- }
- }
这个方法各个文章解释很多,基本有两种解释:
其中一个:
1.取得当前值
2.计算+1后的值
3.如果当前值没有被覆盖的话设置那个+1后的值
4.如果设置没成功, 再从第一步开始
还有一个解释:
CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。(内存的值V和预期值A理论上应该相等,个人理解这两个值一个是在cpu高速缓存中, 一个是在内存中,如果两个值不想等也就是说其它线程已经把该变量修改了。所以需要循环重新取值比较。)
以上是个人理解,欢迎讨论。