多线程-day-09CAS原理
目录
原子操作CAS
什么是原子操作?如何实现原子操作?
CAS的原理
CAS的问题
JDK中相关原子操作类的使用
在JDK5之前,Java语言同步操作,需要依赖synchronized关键字进行同步。这里就产生了锁的概念。synchronized称之为内置锁,也可以称为互斥锁。synchronized内置锁(互斥锁)可能带来以下几个问题:
- 虽然是线程安全,但是在多个线程竞争的情况下,有些一些优先级较低的线程获得锁,那么优先级较高的线程将被阻塞,优先级倒置,优先级高的线程一直等待锁被释放。会引起性能风险。
- 多个线程竞争情况下,频繁的加锁、释放锁,会导致较多的上下文切换和调度演示,因而对性能造成影响。
考虑使用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中相关原子操作类的使用
- 更新基本类型类:AtomicBoolean,AtomicInteger,AtomicLong,AtomicReference
- 更新数组类:AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray
- 更新引用类型:AtomicReference,AtomicMarkableReference,AtomicStampedReference
- 原子更新字段类: AtomicReferenceFieldUpdater,AtomicIntegerFieldUpdater,AtomicLongFieldUpdater
以上为CAS原子操作的相关概念,以及和synchronized内置锁的相关区别,重点在于理解CAS原子操作的原理,为什么使用CAS原子操作,CAS原子操作会产生哪些问题。JDK中提供了哪些CAS原子操作类的使用。
更多精彩敬请关注公众号
Java极客思维
微信扫一扫,关注公众号
多线程-day-09CAS原理相关推荐
- java多线程与并发原理
三.java多线程与并发原理 1.进程和线程的区别: 进程和线程的由来: (1)串行:初期的计算机只能串行执行任务,并且需要长时间等待用户输入: (2)批处理:预先将用户的指令集集中成清单,批量串行处 ...
- windows系统多线程同步机制原理总结
windows系统多线程同步机制原理总结 同步问题是开发过程中遇到的重要问题之一.同步是要保证在并发执行的环境中各个控制流可以有序地执行,包括对于资源的共享或互斥访问,以及代码功能的逻辑顺序. 为了保 ...
- idm多线程下载的原理 idm下载线程数多少合适
idm能够使我们的下载速度提升数倍以上,其核心在于多线程下载,今天聊聊idm多线程下载的原理,idm下载线程数多少合适,希望能够给各位提供一些帮助. 图1 idm优势 一.idm多线程下载的原理 1. ...
- java虚拟机线程调优与底层原理分析_Java并发编程——多线程的底层原理
" Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和 CPU的 ...
- c++中多线程传递参数原理分析
线程可以共享进程的内存空间,线程拥有自己独立内存. 关于参数的传递,std::thread的构造函数只会单纯的复制传入的变量,特别需要注意的是传递引用时,传入的是值的副本,也就是说子线程中的修改影响不 ...
- java同步锁synchronized_synchronized、锁、多线程同步的原理是咋样的?
先综述个结论:一般说的synchronized用来做多线程同步功能,其实synchronized只是提供多线程互斥,而对象的wait()和notify()方法才提供线程的同步功能.一般说synchro ...
- java核心技术-多线程并发设计原理以及常见面试题
文章目录 写在前面 多线程回顾 Thread和Runnable 面试官:为什么我们在项目中推荐使用使用Runnable方法而不用继承Thread? 面试官:Callable为什么可以带返回值,你知道底 ...
- 多线程的底层原理是怎么样的?
多线程之所以能够实现,第一是硬件的功劳,也就是CPU.现代的CPU有一个很重要的特性,就是时间片.每一段获得CPU的代码只能运行一个时间片规定的时间,例如10ms.到时间之后CPU就会把正在运行的代码 ...
- 读写锁原理 java_java多线程-读写锁原理
Java5 在 java.util.concurrent 包中已经包含了读写锁.尽管如此,我们还是应该了解其实现背后的原理. 读/写锁的 Java 实现(Read / Write Lock Java ...
- Android多线程断点续传下载原理及实现,移动开发工程师简历
RandomAccessFile 文件写入 下面再讲讲文件写入问题,由于我们是多线程下载,因此文件并不是每次都是从前往后一个个字节写入的,随时可能在文件的任何一个地方写入数据.因此我们需要能够在文件的 ...
最新文章
- 汇编转c语言,如何把汇编语言转换成C语言
- golang count 单字符 字符串 统计函数
- 快速入门系列--MVC--03控制器和IOC应用
- python open
- 具体数学-第2课(成套方法求解递归式)
- paip.httpd.conf 是空的.txt
- AWK相关学习(转)
- 如何使用代理服务器下载文件_8uftp怎么下载客户文件,怎么使用8uftp下载客户文件?...
- sql sever中计算百分比
- 新浪云 php,php在新浪云中使用imagick的方法
- 51单片机数码管密码锁
- 录制App操作生成Gif动态图教程(Android)
- 37手游基于云平台的大数据建设实践
- matlab中ref代表什么,化妆品ref什么意思
- Python数据分析入门(一)——初探数据可视化
- 朋友圈集赞神器!再也不怕谁让集赞了
- Python深度学习实现DIY专属个人表情包
- javax.servlet.ServletException: java.lang.NoSuchMethodError 解决方法解决办法
- PHP pcre backtrack问题
- SQL Server数据库实操 第四波 视图、索引
热门文章
- google订阅消息推送
- 2021年终总结——拾起好习惯,让自己变得更加优秀
- We're sorry but vue_blog doesn't work properly without JavaScript enabled. Please enable it to.....
- linux统计单拷贝基因家族,基因家族收缩和扩张分析
- c语言个人所得税的打印思路,C语言编写一个计算个人所得税的程序,要求输入收入金额,能够输...
- 哲理故事与管理之道(11)-让自己成为领袖和榜样
- 一牛网:最新6月手机综合性能评测
- java 线程与线程池详解
- 甲骨文与谷歌进入第二轮版权之争
- 企业建站选择阿里云服务器配置详细教程