1.CAS(Compare And Swap)原子操作:

假定有两个操作A和B,如果从执行A的线程来看,当另一个线程执行B时,要么将B全部执行完,要么完全不执行B,那么A和B对彼此来说是原子的。

通过锁,锁机制可以实现原子操作,但锁一般是阻塞的如synchronize关键字就是基于阻塞的锁机制,当一个线程拥有锁时,访问同一资源的其他线程就需要等待,直到该线程释放锁。

但锁操作有着诸多的问题,如被阻塞的线程有限度比较高;获取锁的线程出现不释放情况;大量线程竞争锁,CPU会花费大量的时间和资源进行处理,此外锁机制是一种比较粗粒度的机制,对于像计数器这样的需求显得过于笨重。

实现原子操作还可以通过现代处理器基本都支持的CAS()指令来完成。每一个CAS操作过程都包含三个运算符:一个内存地址V,一个期望的值A和一个新值B,操作的时候如果这个地址上存放的值等于这个期望的值A,则将地址上的值赋为新值B,否则不做任何操作

CAS的基本思路就是,如果这个地址上的值和期望的值相等,则给其赋予新值,否则不做任何事儿,但是要返回原值是多少。循环CAS就是在一个循环里不断的做cas操作,直到成功为止。

2.CAS实现原子操作的三大问题

2.1 ABA问题

因为CAS需要在操作值的时候,检查值有没有发生变化,如果没有发生变化则更新,但是如果一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时会发现它的值没有发生变化,但是实际上却变化了。

ABA问题的解决思路就是使用版本号。在变量前面追加上版本号,每次变量更新的时候把版本号加1,那么A→B→A就会变成1A→2B→3A。

2.2 循环时间长开销大

自旋CAS如果长时间不成功,就会给CPU带来很大的执行开销。

2.3 只能保证一个共享变量的原子操作

当对一个共享变量执行操作时,我们可以使用循环CAS的方式来保证原子操作,但是对多个共享变量操作时,循环CAS就无法保证操作的原子性,这个时候就可以用锁。

还有一个取巧的办法,就是把多个共享变量合并成一个共享变量来操作。比如,有两个共享变量i=2,j=a,合并一下ij=2a,然后用CAS来操作ij。从Java 1.5开始,JDK提供了AtomicReference类来保证引用对象之间的原子性,就可以把多个变量放在一个对象里来进行CAS操作。

3.原子操作类的使用

AtomicInteger  原子更新基本类型

compareAndSet():先判断当前值(旧值)与期望值(expect)是否相等,如果相等 将新值(update)设置为当前值(覆盖了旧值),

/*** Atomically sets the value to the given updated value* if the current value {@code ==} the expected value.** @param expect the expected value* @param update the new value* @return {@code true} if successful. False return indicates that* the actual value was not equal to the expected value.*/public final boolean compareAndSet(int expect, int update) {return unsafe.compareAndSwapInt(this, valueOffset, expect, update);}
/** * Gets the current value. * * @return the current value */public final int get() {    return value;}

incrementAndGet() (类比于) --> ++i
getAndIncrement() (类比于)--> i++

AtomicIntegerArray 原子更新数组里的整形

原子更新引用类型:

AtomicReference

AtomicStampedReference 利用版本戳的形式记录每次改变后的版本号,解决ABA问题, pair使用 int stamp作为计数器使用

AtomicMarkableReference 原子更新带有标记为的引用类型 pair使用boolean mark.关注是否被动过。

参考:http://enjoy.ke.qq.com

转载于:https://www.cnblogs.com/cangshublogs/p/10763844.html

并发编程(三)原子操作CAS相关推荐

  1. Java Review - 并发编程_原子操作类LongAdder LongAccumulator剖析

    文章目录 概述 小Demo 源码分析 重要的方法 long sum() reset sumThenReset longValue() add(long x) longAccumulate(long x ...

  2. Java并发编程-无锁CAS与Unsafe类及其并发包Atomic

    [版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/72772470 出自[zejian ...

  3. php三要素,并发编程三要素:原子性,有序性,可见性

    并发编程三要素 **原子性:**一个不可再被分割的颗粒.原子性指的是一个或多个操作要么全部执行成功要么全部执行失败. 有序性: 程序执行的顺序按照代码的先后顺序执行.(处理器可能会对指令进行重排序) ...

  4. 并发操作之——并发编程三要素

    并发操作 并发操作之--并发编程三要素. 并发操作之--并发编程三要素 并发操作 前言 一.原子性 二.有序性: 三.可见性: 总结 前言 并发操作之--并发编程三要素. 一.原子性 一个不可再被分割 ...

  5. 【并发编程三】C++进程通信——管道(pipe)

    [并发编程三]C++实现通信--管道(pipe) 一.管道(pipe) 二.匿名管道 1.简介 2.父子进程:匿名管道的通信过程? 3.相关函数 3.1.创建管道CreatePipe 3.2.写入管道 ...

  6. java cas机制_java并发编程中的CAS机制,你理解嘛?

    学习Java并发编程,CAS机制都是一个不得不掌握的知识点.这篇文章主要是从出现的原因再到原理进行一个解析.希望对你有所帮助. 一.为什么需要CAS机制? 为什么需要CAS机制呢?我们先从一个错误现象 ...

  7. 进阶笔记——java并发编程三特性与volatile

    欢迎关注专栏:Java架构技术进阶.里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦.微信公众号:慕容千语的架构笔记.欢迎关注一起进步. 前言 前面讲过使用synchronize ...

  8. 漫谈并发编程(三):共享受限资源

    解决共享资源竞争 一个不对的訪问资源演示样例 考虑以下的样例,当中一个任务产生偶数,而其它任务消费这些数字.这里.消费者任务的唯一工作就是检查偶数的有效性. 我们先定义一个偶数生成器的抽象父类. pu ...

  9. java闭锁_【Java并发编程三】闭锁

    1.什么是闭锁? 闭锁(latch)是一种Synchronizer(Synchronizer:是一个对象,它根据本身的状态调节线程的控制流.常见类型的Synchronizer包括信号量.关卡和闭锁). ...

  10. java并发编程(三十五)——公平与非公平锁实战

    前言 在 java并发编程(十六)--锁的七大分类及特点 一文中我们对锁有各个维度的分类,其中有一个维度是公平/非公平,本文我们来探讨下公平与非公平锁. 公平|非公平 首先,我们来看下什么是公平锁和非 ...

最新文章

  1. android自定义属性dimen,android代码里的dimen
  2. NSLog打印当前文件,当前函数,当前行数
  3. lsof用法,查看端口对应的进程,运维(netstat不能用)
  4. 区块链入门教程,这一篇就足够了
  5. Day2:C语言学习2
  6. 8个Python小游戏,可以上班摸鱼玩一天
  7. 应用商店应用计算机,应用市场电脑版
  8. SilverLight4导航
  9. C++标准库分析总结(一)——<标准库简介>
  10. 如何通过8051单片机与片外存储器的连接来解决8051片内RAM和ROM容量不够用的问题
  11. pcntl_alarm()的示例
  12. explicit关键字的作用
  13. 黑白照片修复彩色软件免费有哪些?分享这三个实用的软件给你
  14. ArcGIS 对地下管线进行分类标注
  15. subprocess.Popen获取子程序输出
  16. 中考计算机应用技术有前途吗,计不计入中考成绩,信息技术等科目不再进行考试,今年中考总分会有多少...
  17. C语言入门:根据三角形边长确定三角形为何种三角形
  18. MCAD/MCSD课程选择对比
  19. 《Python3》读书笔记(上)
  20. 定时锁定计算机代码bat,批处理 实现定时关机、注销、重启、锁定等功能

热门文章

  1. mybatis项目启动报错 The content of element type resultMap must match (constructor?,id*,result*,associat...
  2. scvmm live migration issue
  3. Xcode 8 插件安装
  4. linear-gradient 百分比以及斜角的使用
  5. ERP的风险及其预防
  6. Python学习笔记-DNS处理模块dnspython
  7. 问题:# mount –t ntfs /dev/sdb1 /mnt/ 解决办法
  8. vim paste indent problem
  9. mysql忘记密码如何修改
  10. qq讨论组显示连接服务器异常,QQ讨论组出现大面积故障 腾讯回应:因服务器异常 已紧急修复...