目录

原子操作CAS

什么是原子操作?如何实现原子操作?

CAS的原理

CAS的问题

JDK中相关原子操作类的使用


在JDK5之前,Java语言同步操作,需要依赖synchronized关键字进行同步。这里就产生了锁的概念。synchronized称之为内置锁,也可以称为互斥锁。synchronized内置锁(互斥锁)可能带来以下几个问题:

  1. 虽然是线程安全,但是在多个线程竞争的情况下,有些一些优先级较低的线程获得锁,那么优先级较高的线程将被阻塞,优先级倒置,优先级高的线程一直等待锁被释放。会引起性能风险。
  2. 多个线程竞争情况下,频繁的加锁、释放锁,会导致较多的上下文切换和调度演示,因而对性能造成影响。

考虑使用volatile关键字,但是volatile不能保证操作的原子性,因此对于同步的操作最终还是要回到锁的机制上。

        独占锁是一种悲观锁,synchronized就是一种独占锁,会导致其他所有需要锁的线程挂起,一直等待持有锁的线程释放锁后再进行调度。另外一种锁就是乐观锁乐观锁的机制就是:每次不加锁,而是假设没有冲突就去完成某项操作,如果产生冲突失败就重试,一直到成功为止

CAS的原理

利用现代处理器都支持CAS指令,循环这个指令,直到成功为止。 从某种程度上,CAS就是乐观锁。

CAS(Compare And Swap),指令级别保证这是一个原子操作。

CAS三个运算符:一个内存地址V,一个期望值A,一个新值B。

基本思路:如果地址V上的值,和期望值A相等,则给地址V赋给新值B。如果不是,则不做操作,在循环内(死循环/自旋)不断进行CAS操作,直到成功。

CAS带来的问题

        ABA问题:比如两个线程T1和T2,当线程T1从内存地址V取的值A,此时T2也从内存地址V取的值A,并且T2进行了一些运算或者操作,将值A变成了值B,然后T2又因为某种操作将值B变回了值A;此时T1进行CAS操作的时候,发现内存V的值还是只A,然后也操作成功了。这里虽然线程T1执行了操作,并且最终的值也没有问题,但是很明显,对于操作这个内存V的值A,是已经由线程T2进行了相关操作后返回的值,因此就产生了ABA的问题。

举个简单例子:两个人张三,李四;张三把一个打满水的杯子放在桌子上,然后去做其他事情去了;李四经过然后拿起杯子喝了半杯,然后再把杯子的水打满。张三来了之后,并没有杯子有什么异常,看起来还是之前的那杯水,但是实际上杯子里面的水已经动过了。有谁希望自己的杯子被其他人动过呢~

ABA问题解决方案:设置一个版本号,如果某个线程对值进行了操作,则操作完后加一个版本号进行区分。例如:值A初始版本号为1,那么经过T2变化的过程为:A1--->B2--->A3,通过版本号,线程T1就知道值A已经经过了改变。这也是乐观锁的操作流程。

也就是张三把杯子放在桌子上,然后放一个纸条在桌子上,如果谁要动杯子,先在纸上进行一个记录,这样张三做完其他事情回来之后,也可以看到是否自己的杯子是否被动过了。

开销问题:因为CAS操作,都是在一个循环内(死循环/自旋)进行操作,如果长时间不成功则一直进行CAS原子操作,因此会给CPU带来非常大的开销。如果JVM能支持处理器提供的pause指令那么效率会有一定的提升,pause指令有两个作用,第一它可以延迟流水线执行指令(de-pipeline),使CPU不会消耗过多的执行资源,延迟的时间取决于具体实现的版本,在一些处理器上延迟时间是零。第二它可以避免在退出循环的时候因内存顺序冲突(memory order violation)而引起CPU流水线被清空(CPU pipeline flush),从而提高CPU的执行效率。

只能保证一个共享变量的原子操作:当对一个共享变量执行操作时,我们可以使用循环CAS的方式来保证原子操作,但是对多个共享变量操作时,循环CAS就无法保证操作的原子性,这个时候就可以用锁,或者有一个取巧的办法,就是把多个共享变量合并成一个共享变量来操作。比如有两个共享变量i=2,j=a,合并一下ij=2a,然后用CAS来操作ij。从Java1.5开始JDK提供了AtomicReference类来保证引用对象之间的原子性,你可以把多个变量放在一个对象里来进行CAS操作。

Jdk中相关原子操作类的使用

  1. 更新基本类型类:AtomicBoolean,AtomicInteger,AtomicLong,AtomicReference
  2. 更新数组类:AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray
  3. 更新引用类型:AtomicReference,AtomicMarkableReference,AtomicStampedReference
  4. 原子更新字段类: AtomicReferenceFieldUpdater,AtomicIntegerFieldUpdater,AtomicLongFieldUpdater

以上为CAS原子操作的相关概念,以及和synchronized内置锁的相关区别,重点在于理解CAS原子操作的原理,为什么使用CAS原子操作,CAS原子操作会产生哪些问题。JDK中提供了哪些CAS原子操作类的使用。

更多精彩敬请关注公众号

Java极客思维

微信扫一扫,关注公众号

多线程-day-09CAS原理相关推荐

  1. java多线程与并发原理

    三.java多线程与并发原理 1.进程和线程的区别: 进程和线程的由来: (1)串行:初期的计算机只能串行执行任务,并且需要长时间等待用户输入: (2)批处理:预先将用户的指令集集中成清单,批量串行处 ...

  2. windows系统多线程同步机制原理总结

    windows系统多线程同步机制原理总结 同步问题是开发过程中遇到的重要问题之一.同步是要保证在并发执行的环境中各个控制流可以有序地执行,包括对于资源的共享或互斥访问,以及代码功能的逻辑顺序. 为了保 ...

  3. idm多线程下载的原理 idm下载线程数多少合适

    idm能够使我们的下载速度提升数倍以上,其核心在于多线程下载,今天聊聊idm多线程下载的原理,idm下载线程数多少合适,希望能够给各位提供一些帮助. 图1 idm优势 一.idm多线程下载的原理 1. ...

  4. java虚拟机线程调优与底层原理分析_Java并发编程——多线程的底层原理

    " Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和 CPU的 ...

  5. c++中多线程传递参数原理分析

    线程可以共享进程的内存空间,线程拥有自己独立内存. 关于参数的传递,std::thread的构造函数只会单纯的复制传入的变量,特别需要注意的是传递引用时,传入的是值的副本,也就是说子线程中的修改影响不 ...

  6. java同步锁synchronized_synchronized、锁、多线程同步的原理是咋样的?

    先综述个结论:一般说的synchronized用来做多线程同步功能,其实synchronized只是提供多线程互斥,而对象的wait()和notify()方法才提供线程的同步功能.一般说synchro ...

  7. java核心技术-多线程并发设计原理以及常见面试题

    文章目录 写在前面 多线程回顾 Thread和Runnable 面试官:为什么我们在项目中推荐使用使用Runnable方法而不用继承Thread? 面试官:Callable为什么可以带返回值,你知道底 ...

  8. 多线程的底层原理是怎么样的?

    多线程之所以能够实现,第一是硬件的功劳,也就是CPU.现代的CPU有一个很重要的特性,就是时间片.每一段获得CPU的代码只能运行一个时间片规定的时间,例如10ms.到时间之后CPU就会把正在运行的代码 ...

  9. 读写锁原理 java_java多线程-读写锁原理

    Java5 在 java.util.concurrent 包中已经包含了读写锁.尽管如此,我们还是应该了解其实现背后的原理. 读/写锁的 Java 实现(Read / Write Lock Java ...

  10. Android多线程断点续传下载原理及实现,移动开发工程师简历

    RandomAccessFile 文件写入 下面再讲讲文件写入问题,由于我们是多线程下载,因此文件并不是每次都是从前往后一个个字节写入的,随时可能在文件的任何一个地方写入数据.因此我们需要能够在文件的 ...

最新文章

  1. 汇编转c语言,如何把汇编语言转换成C语言
  2. golang count 单字符 字符串 统计函数
  3. 快速入门系列--MVC--03控制器和IOC应用
  4. python open
  5. 具体数学-第2课(成套方法求解递归式)
  6. paip.httpd.conf 是空的.txt
  7. AWK相关学习(转)
  8. 如何使用代理服务器下载文件_8uftp怎么下载客户文件,怎么使用8uftp下载客户文件?...
  9. sql sever中计算百分比
  10. 新浪云 php,php在新浪云中使用imagick的方法
  11. 51单片机数码管密码锁
  12. 录制App操作生成Gif动态图教程(Android)
  13. 37手游基于云平台的大数据建设实践
  14. matlab中ref代表什么,化妆品ref什么意思
  15. Python数据分析入门(一)——初探数据可视化
  16. 朋友圈集赞神器!再也不怕谁让集赞了
  17. Python深度学习实现DIY专属个人表情包
  18. javax.servlet.ServletException: java.lang.NoSuchMethodError 解决方法解决办法
  19. PHP pcre backtrack问题
  20. SQL Server数据库实操 第四波 视图、索引

热门文章

  1. google订阅消息推送
  2. 2021年终总结——拾起好习惯,让自己变得更加优秀
  3. We're sorry but vue_blog doesn't work properly without JavaScript enabled. Please enable it to.....
  4. linux统计单拷贝基因家族,基因家族收缩和扩张分析
  5. c语言个人所得税的打印思路,C语言编写一个计算个人所得税的程序,要求输入收入金额,能够输...
  6. 哲理故事与管理之道(11)-让自己成为领袖和榜样
  7. 一牛网:最新6月手机综合性能评测
  8. java 线程与线程池详解
  9. 甲骨文与谷歌进入第二轮版权之争
  10. 企业建站选择阿里云服务器配置详细教程