并发编程------cas

什么是cas?
cas 的全称即是 Compare And Swap ,是具有原子性的。通俗的理解就是cup的一条并发指令。
cas操作是一种无锁操作,是在多线程下,当有线程访问一个共享资源时,要确定当前该资源是否有其他线程占用,并会自旋获取共享资源。

基本原理
cas的实现是基于Unsafe类中的CAS方法的调用,通过jvm实现汇编指令。

cas思想–代码实现

    public CAS{
          private volatile int value;
          public void cas(int index, int res) {
		     while (true) {
			    int prev = index;
			    int next = res;
			  if (CasSame(prev)) {
				this.value = next;
			}
		}
	}

	       public boolean CasSame(int k) {
		       return k == value;
	        }
   }

解读:
cas方法实际index 指的是我们要修改的值,而CAS类中的value是多线程操作下,该变量现在实际的值,index是指当前线程value的值。第二个res即指的是我们需要保存的值。
CasSame方法对应就是判断多线程情况下value,与该当前线程的值是否一样。若一样则可以更改其值。否则自旋,不断循环。

cas的弊端:

  • ABA问题
    -------从上面我的代码大致的实现cas操作,可以看出我们只是判断出其值是否为index==value,然后对其修改。这就引出了我们都在讲的ABA问题,对于value的值我们不确定是否修改为其他值,而后又修改回来。
  • 循环时间不确定
    -------可以看出我们是一直循环等待值相等的时候才进行退出循环,此时一直在不断消耗cpu资源。
  • 只能保证一个变量的原子性
    -------从上面的代码可以看出我们只能保证value的原子性,要对多变量就要实现更多方法来保证,这样一来就不是cas操作了,毕竟是基于硬件实现的功能。

这就是小编最近学习并发编程对于cas的一个理解,如果大家觉得那个地方不对,欢迎评论!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值