https://blog.csdn.net/qq_35492857/article/details/78471032

https://www.cnblogs.com/gdjdsjh/p/5076815.html    CAS操作

https://blog.csdn.net/kkfdsa132/article/details/5474013   c#之线程同步浅析(1)-----轻量级同步Interlocked

CAS(compare and wasp)比较并操作,解决多线程并行情况下使用锁造成性能损耗的机制。

所以在写CAS之前先说说基于锁的编程的都有哪些缺点。

以下内容参考网上现有资料。

锁的缺点:

多线程编程中 我们一般会使用各种锁来确保对共享资源的访问和操作,需要共享的数据要对它的访问串行化。

修改共享数据的操作必须以原子操作的形式出现才能保证不被其它线程破坏相应数据。

锁这种机制无法彻底避免以下几点问题:

1、锁引起线程的阻塞,对于没有能占用到锁的线程或者进程将会一直等待锁的占有者释放资源后才能继续。

2、申请和释放锁的操作增加了很多访问共享资源的消耗。

3、锁不能很好的避免编程开发者设计实现的程序出现死锁或者活锁可能

4、优先级反转和所护送怪现象

5、难以调试

-------------以上几点来自http://blog.csdn.net/liusuper2088/article/details/41047501

无锁编程:

不用锁的情况下实现多线程间的同步,即非阻塞同步。

非阻塞同步分三个级别:

1、wait-free

整个操作保证每个线程在有限步骤下完成

保证系统及吞吐以及无线程饥饿

理想模式

2、lock-free

允许个别线程饥饿,保证系统级吞吐量

确保至少有一个线程能继续执行

3、obstruction-free

任何时刻一个线程被隔离为一个事务进行执行(其它线程suspended)且在有限步骤内完成

一旦发现数据被修改,回滚

也叫乐观锁

lock-free必然是obstruction-free的

-------以上内容来自http://www.cnblogs.com/caca/p/lock-free_CAS_ABA.html

悲观锁和乐观锁:

1、悲观锁:独占和排他,所以在数据处理过程中将数据处于锁定状态。

传统的关系型数据库就用了很多这种锁:行锁、表锁、读写锁都是操作前上锁。会加大长事务的开销。

2、乐观锁:修改数据不会上锁但是更新时会判断期间又没有发生数据的更新。

避免长事务开销,但可能会造成脏数据。

基于版本记录机制实现。

CAS:

CAS原语有三个操作数——内存位置(V)、预期原值(A)、新值(B)。

若内存位置与预期原值匹配则处理器将该位置更新为新值。否则不做操作。

无论何种情况都会在CAS指令之前返回该位置值。这个过程是原子性的。

使用CAS会造成ABA问题。

CAS是项乐观锁技术,若有多个线程试图同时更新一个变量,只有一个线程能更新,其它线程失败,失败的线程仍可再次尝试。

CAS可以通过乐观锁模式实现自增自减的高并发效率。

ABA问题:

如果另一个线程修改V值,假设原来是A,先修改成B后又修改回A,当前线程的CAS操作无法分辨V是否变化。

解决方法:在CAS操作时,带上版本号,每修改一次,版本号+1,之后比较原值的时候还要比较版本号

通过CAS实现一个无锁队列

无锁队列的链表实现:

EnQueue(x)//进队

{

//准备新加入的结点数据

q = new record();

q->value = x;

q->next = NULL;

p = tail;//链表尾指针

oldp = p;

do

{//开始loop cas

while(p->next != NULL)//防止进行cas(tail,oldp,q)操作的线程挂掉引起死循环

p = p->next;

}

while(CAS(p->next,NULL,q)!=true);//如果没有吧结点链在尾指针上,再试

CAS(tail,oldp,q);//置尾结点

}

DeQueue()//出队

{

do

{

p = head;

if(p->next == NULL)

{

return ERR_EMPTY_QUEUE;

}

while(CAS(head,p,p->next)!=true);

return p->next->value;

}

}

------------无锁队列部分来自《Implementing Lock-Free Queues》。

http://blog.csdn.net/liusuper2088/article/details/41047501=。=这篇说的更详细一点

CPU的CAS操作的更多相关文章

  1. Java并发--Java中的CAS操作和实现原理

    版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/CringKong/article/deta ...

  2. 【Java并发编程实战】-----“J.U.C”:CAS操作

    CAS,即Compare and Swap,中文翻译为"比较并交换". 对于JUC包中,CAS理论是实现整个java并发包的基石.从整体来看,concurrent包的实现示意图如下 ...

  3. 并发中的Native方法,CAS操作与ABA问题

    Native方法,Unsafe与CAS操作 >>JNI和Native方法 Java中,通过JNI(Java Native Interface,java本地接口)来实现本地化,访问操作系统底 ...

  4. 非阻塞同步机制与CAS操作

    锁的劣势 Java在JDK1.5之前都是靠synchronized关键字保证同步的,这种通过使用一致的锁定协议来协调对共享状态的访问,可以确保无论哪个线程 持有守护变量的锁,都采用独占的方式来访问这些 ...

  5. SpinLock 自旋锁, CAS操作(Compare & Set) ABA Problem

    SpinLock 自旋锁 spinlock 用于CPU同步, 它的实现是基于CPU锁定数据总线的指令. 当某个CPU锁住数据总线后, 它读一个内存单元(spinlock_t)来判断这个spinlock ...

  6. synchronized底层实现原理&CAS操作&偏向锁、轻量级锁,重量级锁、自旋锁、自适应自旋锁、锁消除、锁粗化

    进入时:monitorenter 每个对象有一个监视器锁(monitor).当monitor被占用时就会处于锁定状态,线程执行monitorenter指令时尝试获取monitor的所有权,过程如下:1 ...

  7. Go并发编程之美-CAS操作

    摘要: 一.前言 go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁.CAS.原子变量操作类.相比Java来说go提供了独特的基于通道的同步措施.本节我 ...

  8. 具体CAS操作实现(无锁算法)

    具体CAS操作 上一篇讲述了CAS机制,这篇讲解CAS具体操作. 什么是悲观锁.乐观锁?在java语言里,总有一些名词看语义跟本不明白是啥玩意儿,也就总有部分面试官拿着这样的词来忽悠面试者,以此来找优 ...

  9. 基于CAS操作的非阻塞算法

    非阻塞算法(non-blocking algorithms)定义        所谓非阻塞算法是相对于锁机制而言的,是指:一个线程的失败或挂起不应该引起另一个线程的失败或挂起的一种算法.一般是利用硬件 ...

随机推荐

  1. matlab rand(3,5)

    rand()函数在(0,1)上创建均匀分布的随机数的数组 >> rand(3,5) ans = 0.8147 0.9134 0.2785 0.9649 0.9572 0.9058 0.63 ...

  2. revit导出模型数据到sqlserver数据库

    revit软件可以导出模型数据到sqlserver数据库,有时候,为了对模型做数据分析,需要导出模型的数据,下面总结一下导出过程: 首先在sqlserver中建立一个数据库,如:revit_wujin ...

  3. 【Android4高级编程笔记】深入探讨Android Activity

    创建Activity 要创建一个新的Activity,需要对Activity类进行扩展,在新类定义用户界面并实现新的功能. 视图是用来显示数据和提高用户交互的Ui控件.Android提供了多个布局类, ...

  4. C 标签使用

    JSTL 核心标签库标签共有13个,功能上分为4类: 1.表达式控制标签:out.set.remove.catch 2.流程控制标签:if.choose.when.otherwise 3.循环标签:f ...

  5. [raspberry pi3] 安装ffmpeg

    买了个pi3,pi相对于通常的嵌入式系统的最大好处是里面夹带了gcc编译器,有很多东西都不需要交叉编译了. arm和pc的性能还是不能比的,io的瓶颈还是很明显的, 想要编的快点还是要在pc上交叉编译 ...

  6. WPF开源界面库

    WPF开源项目 WPF有很多优秀的开源项目,我以为大家都知道,结果,问了很多人,其实他们不知道.唉,太可惜了! 先介绍两个比较牛逼的界面库 1.MaterialDesignInXamlToolkit ...

  7. C#知识点总结系列:3、C#中Delegate和Event以及它们的区别

    1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取锁之后因为异常,致锁 ...

  8. 哈雷监控设备的操作及升级NSG9k6G

    哈雷监控设备的操作及升级NSG9k6G 一.下载升级包: http://pan.baidu.com/s/1kTmw9sr 如连接不可以用可以直接私聊我.QQ1841031740 二.升级: 下载完后, ...

  9. [poj 2456] Aggressive cows 二分

    Description Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stal ...

  10. [SinGuLaRiTy] NOIP 膜你赛-Day 2

    [SinGuLaRiTy-1031] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 对于所有题目: Time Limit: 1s | Mem ...