谈谈CAS的常规用法

CAS的核心操作是比较并交换,具体是假设当前内存位置V的值为A,如果给定的值确实为A那么将新值B设置到内存位置V上,最后总是返回内存位置原有的值。

这是一个典型的读-改-写的操作,并且是原子操作,那可以利用这个特性来构建无锁的线程安全操作。具体的步骤与CAS的核心操作是类似的,只是当CAS操作失败的时候会一直检查失败条件直至成功(注意:这里如果长时间不成功则会占用大量的CPU资源,一种情况就是在“谈谈原子变量与锁的性能比较”中提到的大量线程在激烈竞争的时候会导致更多的竞争)。以数值自增为例:

private static class MyAtomicInteger{
        AtomicInteger ai = new AtomicInteger(0);
        
        public int incrementAndGet(){
            while(true){
                int old =  ai.get();
                int newVal = old+1;
                if(ai.compareAndSet(old, newVal)){
                    return newVal;
                }
            }
        }
    }

虽然AtomicInteger自带该方法,但这里为了说明执行原理。

 

转载于:https://my.oschina.net/u/1268334/blog/3000414

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值