博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
谈谈CAS的常规用法
阅读量:6677 次
发布时间:2019-06-25

本文共 539 字,大约阅读时间需要 1 分钟。

hot3.png

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

你可能感兴趣的文章
mvc SelectList selected失效的解决方法
查看>>
JAVA 设计模式 中介者模式
查看>>
我的软件工程课目标
查看>>
var a={n:1}; var b=a; a.x=a={n:2}; console.log(a.x); console.log(b.x);
查看>>
【HDOJ】3016 Man Down
查看>>
window.open打开新页面,并将本页数据用过url传递到打开的页面;需要两个页面;...
查看>>
查看本机IP分为两种情况:
查看>>
Scala进阶之路-Scala特征类与unapply反向抽取
查看>>
洛谷P3057 [USACO12NOV]远处的牧场Distant Pastures
查看>>
hdu3415 Max Sum of Max-K-sub-sequence 单调队列
查看>>
6421B Lab2 DHCP的配置及故障排除
查看>>
[C# 基础知识梳理系列]专题一:深入解析委托——C#中为什么要引入委托
查看>>
FOSCommentBundle功能包:其它添加评论到页面的方法
查看>>
SQL Server 2012笔记分享-17:理解并设置文件表(FileTable)
查看>>
MongoDB运行状态、性能监控与分析
查看>>
Exchange 2016共享邮箱不保存已发送邮件的问题
查看>>
[C#基础知识系列]全面解析C#中静态与非静态
查看>>
SQL Server 2012笔记分享-40:自动维护索引
查看>>
C/C++各种系统开发环境搭建
查看>>
dwz navtab 限制打开数量实例
查看>>