彩票网站搭建 做网站,科技自主自强国家发展战略,做网站图片分辨率多少,吴中企业建设网站报价1. 前言
本节内容主要是对 CAS 操作原理进行讲解#xff0c;由于 CAS 涉及到了并发编程包的使用#xff0c;本节课程只对 CAS 的原理问题进行讲解#xff0c;有助于同学后续对并发编程工具使用的学习。本节具体内容点如下#xff1a;
了解 CAS 的概念#xff0c;这是本节…1. 前言
本节内容主要是对 CAS 操作原理进行讲解由于 CAS 涉及到了并发编程包的使用本节课程只对 CAS 的原理问题进行讲解有助于同学后续对并发编程工具使用的学习。本节具体内容点如下
了解 CAS 的概念这是本节内容的基础知识了解 CAS 诞生的背景能够更好地理解 CAS这是本节的基础知识了解 CAS 操作诞生的意义这也是 CAS 操作的作用所在了解 CAS 的操作原理这也是本节内容的核心知识点其他知识点都是围绕这一知识点展开的了解 CAS 中常见的 ABA 问题这是本节内容的重点。 2. 什么是 CAS
概念CAS 是 CompareAndSwap 的简称是一种用于在多线程环境下实现同步功能的机制。
从字面上理解就是比较并更新。简单来说从某一内存上取值 V和预期值 A 进行比较如果内存值 V 和预期值 A 的结果相等那么我们就把新值 B 更新到内存如果不相等那么就重复上述操作直到成功为止。 3. CAS 诞生的背景
synchronized 时代在多线程中为了保持数据的准确性避免多个线程同时操作某个变量很多情况下利用关键字 synchronized 实现同步锁。
使用 synchronized 关键字可以使操作的线程排队等待运行可以说是一种悲观策略认为线程会修改数据所以开始就把持有锁的线程锁住其他线程只能是挂起状态等待锁的释放所以同步锁带来了效率问题。
synchronized 时代效率问题在线程执行的时候获得锁的线程在运行其他被挂起的线程只能等待着持有锁的线程释放锁才有机会运行在效率上都浪费在等待上。
在很多的线程切换的时候由于有同步锁就要涉及到锁的释放加锁这又是一个很大的时间开销。
volatile 时代与锁阻塞机制的方式相比有一种更有效地方法非阻塞机制同步锁带来了线程执行时候之间的阻塞而这种非阻塞机制在多个线程竞争同一个数据的时候不会发生阻塞的情况这样在时间上就可以节省出很多的时间。
我们会想到用 volatile使用 volatile 不会造成阻塞volatile 保证了线程之间的内存可见性和程序执行的有序性可以说已经很好的解决了上面的问题。
volatile 时代原子操作问题一个很重要的问题就是volatile 不能保证原子性对于复合操作例如 i 这样的程序包含三个原子操作取值增加赋值。 4. CAS 操作诞生的意义
意义从上边 CAS 操作诞生的背景所说的CASCompare And Swap 比较和交换解决了 volatile 不能保证原子性的问题。从而 CAS 操作即能够解决锁的效率问题也能够保证操作的原子性。 Tips在 JDK1.5 新增的 java.util.concurrent (JUC java 并发工具包) 就是建立在 CAS 之上的。相比于 synchronized 这种堵塞算法 CAS 是非堵塞算法的一种常见实现。所以 JUC 在性能上有了很大的提升。 5. CAS 操作原理
CAS 主要包含三个操作数内存位置 V进行比较的原值 A和新值 B。
当位置 V 的值与 A 相等时CAS 才会通过原子方式用新值 B 来更新 V否则不会进行任何操作。无论位置 V 的值是否等于 A都将返回 V 原有的值。 上面说到了同步锁是一种悲观策略CAS 是一种乐观策略每次都开放自己不用担心其他线程会修改变量等数据如果其他线程修改了数据那么 CAS 会检测到并利用算法重新计算。
CAS 也是同时允许一个线程修改变量其他的线程试图修改都将失败但是相比于同步锁CAS 对于失败的线程不会将他们挂起他们下次仍可以参加竞争这也就是非阻塞机制的特点。 6. ABA 问题
ABA 问题描述
假设有两个线程线程 1 和线程 2线程 1 工作时间需要 10 秒线程 2 工作需要 2 秒主内存值为 A第一轮线程 1 和线程 2 都把 A 拿到自己的工作内存第 2 秒线程 2 开始执行线程 2 工作完成把 A 改成了 B 第 4 秒线程 2 把 B 又改成了 A然后就线程 2 进入休眠状态第 10 秒线程 1 工作完成看到期望为 A 真实值也是 A 认为没有人动过其实 A 已经经过了修改只不过又改了回去然后线程 1 进行 CAS 操作。
ABA 问题解决为了解决这个问题在每次进行操作的时候加上一个版本号或者是时间戳即可。 7. 小结
本节内容的核心知识点即了解 CAS 的操作原理其他知识点都是围绕这一知识点展开的对于 CAS 中所引发的 ABA 问题以及该问题的解决方式为本节内容重点。需要对这两点进行着重掌握。