CAS,compare and swap的缩写,中文翻译成比较并交换。
我们都知道,在java语言之前,并发就已经广泛存在并在服务器领域得到了大量的应用。所以硬件厂商老早就在芯片中加入了大量直至并发操作的原语,从而在硬件层面提升效率。在intel的CPU中,使用cmpxchg指令。
在Java发展初期,java语言是不能够利用硬件提供的这些便利来提升系统的性能的。而随着java不断的发展,Java本地方法(JNI)的出现,使得java程序越过JVM直接调用本地方法提供了一种便捷的方式,因而java在并发的手段上也多了起来。而在Doug Lea提供的cucurenct包中,CAS理论是它实现整个java包的基石。
1. CAS:
CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。 如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值 。否则,处理器不做任何操作。无论哪种情况,它都会在 CAS 指令之前返回该 位置的值。(在 CAS 的一些特殊情况下将仅返回 CAS 是否成功,而不提取当前 值。)CAS 有效地说明了“我认为位置 V 应该包含值 A;如果包含该值,则将 B 放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。”
通常将 CAS 用于同步的方式是从地址 V 读取值 A,执行多步计算来获得新 值 B,然后使用 CAS 将 V 的值从 A 改为 B。如果 V 处的值尚未同时更改,则 CAS 操作成功。
类似于 CAS 的指令允许算法执行读-修改-写操作,而无需害怕其他线程同时 修改变量,因为如果其他线程修改变量,那么 CAS 会检测它(并失败),算法 可以对该操作重新计算。
2.非阻塞算法
如果每个线程在其他线程任意延迟(或甚至失败)时都将持续进行操作,就可以说该算法是无等待的。与此形成对比的是,无锁定算法要求仅 某个线程 总是执行操作。(无等待的另一种定义是保证每个线程在其有限的步骤中正确计 算自己的操作,而不管其他线程的操作、计时、交叉或速度。
3.用CAS来实现非阻塞算法
- package zl.study.concurrency;
- /**
- * AtomicInteger的模拟类,主要是用来测试CAS和非阻塞方式加锁
- * @author peter
- *
- */
- public class SimulatedAtomicInteger {
- private int value= 0;
- private int get(){
- return this.value;
- }
- /**
- * 模拟CAS
- * @param current
- * @param next
- * @return
- */
- private synchronized boolean compareAndSet(int current,int next){
- return current == next?true:false;
- }
- /**
- * 模拟非阻塞算法
- * @return
- */
- public final int incrementAndGet() {
- for (;;) {
- int current = get();
- int next = current + 1;
- if (compareAndSet(current, next))
- return next;
- }
- }
- }
需要注意的是这个方法中的CAS是在jav代码实现的,这个并没有包含内存位置。在concurrent包中,是JNI的方式,内存位置也作为参数传入这个JNI方法中,在后面碰到了在做详细的介绍
在后面介绍java 5提供的并发工具时,我们还能经常看到类似于SimulatedAtomicInteger得写法,大家可以好好体会!
相关推荐
Thread安全是Java多线程编程中的一种设计理念,用于确保多个线程可以安全地共享数据和资源。Thread安全可以通过使用线程同步机制、线程安全的数据结构和ThreadLocal变量等方式来实现。 CAS操作 CAS(Compare And ...
`demo.docx`可能包含各种多线程编程的示例,如生产者消费者模型、银行转账场景等。`API.docx`可能详细列出了相关类和方法的使用。`多线程.docx`可能是关于Java多线程的深入讲解,涵盖线程安全、线程同步、锁的使用等...
### 深入浅出Java多线程.pdf #### 知识点概览 本PDF文档涉及了Java多线程的全面介绍,分为基础篇、原理篇和JDK工具篇三个部分,旨在帮助读者深入了解Java多线程的概念、原理及实践应用。 #### 基础篇 **1. 进程...
│ 高并发编程第一阶段26讲、多线程下的生产者消费者模型,以及详细介绍notifyAll方法.mp4 │ 高并发编程第一阶段27讲、wait和sleep的本质区别是什么,深入分析(面试常见问题).mp4 │ 高并发编程第一阶段28讲、...
在分析Netty5多线程编程之前,首先需要了解Java内存模型与多线程编程的关系。硬件技术的进步,特别是多核处理器的发展和成本的降低,使得多任务处理成为操作系统的基本功能。多核处理器能够同时执行多个线程,使得...
CAS(Compare and Swap)作为一种重要的同步机制,在多线程环境中发挥着关键作用。它能够帮助开发者实现无锁编程,提高程序运行效率。本文将深入剖析Java中CAS的基本原理及其背后的硬件支持机制。 #### 二、CAS基本...
Java多线程、锁以及内存模型是Java编程中不可或缺的部分,尤其在面试中,这些问题的掌握程度往往被视为衡量开发者技术水平的重要标准。以下是一些关于Java并发编程的关键知识点: 1. **Synchronized原理**:...
Java-JUC-多线程进阶resources是 Java 并发编程的高级课程,涵盖了 Java 中的并发编程概念、线程安全、锁机制、集合类、线程池、函数式接口、Stream流式计算等多个方面。 什么是JUC JUC(Java Utilities for ...
#### 三、多线程编程 - **创建线程的方式**: - 继承`Thread`类并重写`run()`方法。 - 实现`Runnable`接口,并将实现类对象作为参数传递给`Thread`类的构造器。 - 使用`Callable`接口和`FutureTask`类来创建有...
Java多线程、锁以及内存模型是Java编程中极为关键且深入的部分,它们涉及到程序的并发性能、稳定性以及数据一致性。下面将详细讲解这些领域的核心知识点。 1. **Java多线程** - **线程定义**:线程是程序执行的...
《Java并发编程实战》是Java并发编程领域的一本经典著作,它深入浅出地介绍了如何在Java平台上进行高效的多线程编程。这本书的源码提供了丰富的示例,可以帮助读者更好地理解书中的理论知识并将其应用到实际项目中。...
在多线程编程中,Java内存模型.play了非常重要的角色。Java内存模型规定了线程如何访问和操作共享变量,如何保持数据的一致性等。Java内存模型中有三个重要的概念:原子性、可见性和有序性。原子性是指操作是不可...
Java多线程编程是Java语言提供的一种基础的并发编程方式。在Java中,线程是一段执行的代码序列,可以与其他代码同时运行。多线程编程允许我们设计出可以同时执行多个任务的应用程序,这在进行诸如图像处理、文件操作...
在深入探讨Java多线程设计模式的知识点之前,让我们首先明确多线程编程在Java中的地位和作用。Java自诞生之日起就内置了对多线程编程的支持,这使得开发能够充分利用多核处理器性能的应用程序成为可能。多线程设计...
书籍中涉及的内容广泛,涵盖了从基础概念到复杂场景下的并发问题解决方法,是多线程编程人员的重要参考资料。 书中特别强调了摩尔定律(Moore’s Law)和安达尔定律(Amdahl’s Law)对并发编程的影响。摩尔定律...