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

android|android 多线程 — CAS 算法 + 原子性操作类
文章图片
20180522_meizitu_08.jpg 【android|android 多线程 — CAS 算法 + 原子性操作类】CAS 也叫无锁算法(Compare and Swap),核心思想是:当多个线程尝试使用 CAS算法同时更新同一个变量时,只有一个线程能更新变量的值,而其他线程都失败,失败的线程并不会挂起,而是被告知这次竞争中失败,并可以再次尝试
CAS 有3个操作数,内存值 V,旧的预期值 A,要修改的新值 B,当且仅当预期值 A 和内存值 V 相同时,将内存值 V 修改为 B,否则什么都不做
这3个参数不好理解吧,我初看时也觉得蛋疼,这应该是翻译的缘故,但是谁让大家这都这么叫呢,那么怎么理解呢,我们先了解下数据在内存中的计算过程
我们知道 JVM 模型中,对象存储在对堆内存中,堆内存是公用的;但是每个线程有自己的方法栈内存,但是这个栈内存是私有的,线程之能访问自己的栈内存,不能访问别人的。更坑爹的是 CPU 还有自己的高速缓存,因为内存的速度很慢,没法给 CPU 拿来做计算用,所以 CPU 之能另起炉灶,有一级,二级,三级缓存,这些缓存也是私有的,那么在做计算时线程和 cpu 都会吧所需的数据从堆内存 copy 一份到自己的存储空间中,完事再写回去,这也是内存的不连续特性

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

android|android 多线程 — CAS 算法 + 原子性操作类
文章图片
原子操作类

    推荐阅读