android 多线程 — CAS 算法 + 原子性操作类

20180522_meizitu_08.jpg

CAS 也叫无锁算法(Compare and Swap),核心思想是:当多个线程尝试使用 CAS算法同时更新同一个变量时,只有一个线程能更新变量的值,而其他线程都失败,失败的线程并不会挂起,而是被告知这次竞争中失败,并可以再次尝试

CAS 有3个操作数,内存值 V,旧的预期值 A,要修改的新值 B,当且仅当预期值 A 和内存值 V 相同时,将内存值 V 修改为 B,否则什么都不做

这3个参数不好理解吧,我初看时也觉得蛋疼,这应该是翻译的缘故,但是谁让大家这都这么叫呢,那么怎么理解呢,我们先了解下数据在内存中的计算过程

我们知道 JVM 模型中,对象存储在对堆内存中,堆内存是公用的;但是每个线程有自己的方法栈内存,但是这个栈内存是私有的,线程之能访问自己的栈内存,不能访问别人的。更坑爹的是 CPU 还有自己的高速缓存,因为内存的速度很慢,没法给 CPU 拿来做计算用,所以 CPU 之能另起炉灶,有一级,二级,三级缓存,这些缓存也是私有的,那么在做计算时线程和 cpu 都会吧所需的数据从堆内存 copy 一份到自己的存储空间中,完事再写回去,这也是内存的不连续特性


忽略期中的通知数值改变箭头

知道了上面这点我们就可以继续 CAS 算法了,V / A / B 3个值,V 是存储在内存中数值,A 是 CPU1 从内存 copy 过来的副本,B 就 CPU1 计算后的数据,当有多个 CPU 同时基于 CAS 算法更新同一个数据,大家在计算完毕后会比较当前内存中的值 V 和我当初 copy 过来的值 A 是不是一样,一样的话说明我比别人算的快,没有抢在我头了,我可以更新数据到内存了。其他的线程计算完成时一看自己 copy 的值已经和当前内存中的值不一样了,那么本次计算结果肯定就不对了,所以放弃了计算结果,重新更新一次数据再次做计算



原子操作类

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 3,751评论 0 11
  • 锁的代价 锁是用来做并发最简单的方式,当然其代价也是最高的。内核态的锁在锁的时候需要操作系统进行一次上下文切换,加...
    cgw丶阅读 3,260评论 0 5
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,159评论 1 32
  • 别人的总结不一定适合自己,所以尽量多做一些自己的总结,针对自己的薄弱点重点说明,适当的借鉴别人,少走一些弯路。最重...
    renkuo阅读 7,496评论 2 48
  • Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和...
    Java小辰阅读 4,778评论 5 209