zoukankan      html  css  js  c++  java
  • 解决并发问题的CAS思想及原理

     
    全称为:Compare and swap(比较与交换),用来解决多线程并发情况下使用锁造成性能开销的一种机制;
     
    原理思想:CAS(V,A,B),V为内存地址,A为预期原值,B为新值。如果内存地址V的值等于A,那么将V修改成B;否则,说明V被其他线程处理过。那么,是否有可能在即将修改V的值为B的时候被其他线程修改了V的值了?答案是不可以的,因为CAS操作实际上由CPU提供支持,是原语(原语是操作系统或计算机网络用语范畴。是由若干条指令组成的,用于完成一定功能的一个过程,具有不可分割性,即原语的执行必须是连续的,在执行过程中不允许被中断)。
     

    CAS的缺点:

    CAS虽然很高效的解决了原子操作问题,但是CAS仍然存在三大问题。
    1. 循环时间长开销很大 : 如果CAS失败,会一直进行尝试。如果CAS长时间一直不成功,可能会给CPU带来很大的开销。
    2. 只能保证一个共享变量的原子操作。
    3. ABA问题。如果内存地址V初次读取的值是A,并且在准备赋值的时候检查到它的值仍然为A,那我们就能说它的值没有被其他线程改变过了吗?如果在这段期间它的值曾经被改成了B,后来又被改回为A,那CAS操作就会误认为它从来没有被改变过。这个漏洞称为CAS操作的“ABA”问题。Java并发包为了解决这个问题,提供了一个带有标记的原子引用类“AtomicStampedReference”,它可以通过控制变量值的版本来保证CAS的正确性。因此,在使用CAS前要考虑清楚“ABA”问题是否会影响程序并发的正确性,如果需要解决ABA问题,改用传统的互斥同步可能会比原子类更高效。
  • 相关阅读:
    C#面试题
    深入浅出JSONP--解决ajax跨域问题
    vs切换当前编辑文件时自动定位目录树
    测试从应用到DB的准确的网络延迟
    MySQL死锁检测和回滚
    [磁盘空间]lsof处理文件恢复、句柄以及空间释放问题
    [硬件知识]OP(Over-provisioning)预留空间
    查看实例上面无主键的表
    mysql replace语句
    理解innodb buffer pool
  • 原文地址:https://www.cnblogs.com/zhaohuaxishi/p/12068209.html
Copyright © 2011-2022 走看看