java CAS

CAS,CompareAndSet,说白了它就是一个方法吧。

有些问题可能会混淆,在此记录下:

1、++i,这样的操作其实并不是线程安全的;

2、有关AtomicInteger的incrementAndGet方法其实也不是绝对能获得预期值的,因为可能有ABA问题;

3、好多文章都说CAS是不存在锁的,但是个人认为就看你怎么理解这个锁了,CAS底层实现挖掘到汇编语言,里面还是有锁的,只不过这个锁是针对cpu,操作系统层面的;

4、incrementAndGet这个方法是可并发的,但是CompareAndSet应该是单线程不存在并发的,原因估计就是因为第三条。

 

 

 

  1. /** 
  2.      * Atomically increments by one the current value. 
  3.      * 
  4.      * @return the updated value 
  5.      */  
  6.     public final int incrementAndGet() {  
  7.         for (;;) {  
  8.             int current = get();  
  9.             int next = current + 1;  
  10.             if (compareAndSet(current, next))  
  11.                 return next;  
  12.         }  
  13.     } 

 

这个方法各个文章解释很多,基本有两种解释:

其中一个:

1.取得当前值
2.计算+1后的值
3.如果当前值没有被覆盖的话设置那个+1后的值
4.如果设置没成功, 再从第一步开始

还有一个解释:

CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。(内存的值V和预期值A理论上应该相等,个人理解这两个值一个是在cpu高速缓存中, 一个是在内存中,如果两个值不想等也就是说其它线程已经把该变量修改了。所以需要循环重新取值比较。)

 

以上是个人理解,欢迎讨论。

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值