博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
非阻塞同步算法与CAS(Compare and Swap)无锁算法
阅读量:6297 次
发布时间:2019-06-22

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

CAS无锁算法

要实现无锁(lock-free)的非阻塞算法有多种实现方法,其中是一种有名的无锁算法。CAS, CPU指令,在大多数处理器架构,包括IA32、Space中采用的都是CAS指令,CAS的语义是“我认为V的值应该为A,如果是,那么将V的值更新为B,否则不修改并告诉V的值实际为多少”,CAS是项乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。CAS无锁算法的java实现如下:

public synchronized int compareAndSwap(int expect, int newValue) {        int old = this.a;        if (old == expect) {            this.a = newValue;        }        return old;    }

CAS无锁算法的C实现如下:

int compare_and_swap (int* reg, int oldval, int newval) {  ATOMIC();  int old_reg_val = *reg;  if (old_reg_val == oldval)     *reg = newval;  END_ATOMIC();  return old_reg_val;}

 

详细的转自:http://www.cnblogs.com/Mainz/p/3546347.html

http://www.2cto.com/kf/201312/261150.html

二、ABA问题

CAS看起来很爽,但是会导致“ABA问题”。

CAS算法实现一个重要前提需要取出内存中某时刻的数据,而在下时刻比较并替换,那么在这个时间差类会导致数据的变化。

比如说一个线程one从内存位置V中取出A,这时候另一个线程two也从内存中取出A,并且two进行了一些操作变成了B,然后two又将V位置的数据变成A,这时候线程one进行CAS操作发现内存中仍然是A,然后one操作成功。尽管线程one的CAS操作成功,但是不代表这个过程就是没有问题的。如果链表的头在变化了两次后恢复了原值,但是不代表链表就没有变化。因此前面提到的原子操作AtomicStampedReference/AtomicMarkableReference就很有用了。这允许一对变化的元素进行原子操作。

解决方法

一个常用的方法是添加额外的“tag”或“stamp”位来标记是指针是否被修改过。

详细转自:http://www.cnblogs.com/549294286/p/3766717.html

你可能感兴趣的文章
关于导入My97DatePicker时间插件遇到的问题及解决方案
查看>>
基于python的scrapy爬虫抓取京东商品信息
查看>>
Mac设置环境变量
查看>>
cookie和session 创建和验证 原始的servlet
查看>>
Linux-Apache和PHP结合
查看>>
shell3
查看>>
CNC加工中心刀柄类型
查看>>
WordPress设计bug+WooCommerce漏洞导致网站存在被劫持风险
查看>>
新品【国内动态】服务器列表
查看>>
10月个人考核
查看>>
离线数据处理与流数据处理的区别
查看>>
照相功能
查看>>
MATLAB编程与应用系列-第2章 数组及矩阵的创建及操作(4)
查看>>
变频电源要怎么测定额定容量
查看>>
git 使用笔记 oschina ,mac
查看>>
盒子模型
查看>>
Windows平台的Eclipse-javaEE-mars相关配置
查看>>
Oracle导入导出
查看>>
每日一学|数据中心spine leaf网络架构
查看>>
DockerSwarm 微服务部署
查看>>