CAS(Compare and swap)比较和替换是设计并发算法时用到的一种技术。简单来说,比较和替换是使用一个期望值和一个变量的当前值进行比较,如果当前变量的值与我们期望的值相等,就使用一个新值替换当前变量的值。这听起来可能有一点复杂但是实际上你理解之后发现很简单,接下来,让我们跟深入的了解一下这项技术。
CAS的使用场景
在程序和算法中一个经常出现的模式就是“check and act”模式。先检查后操作模式发生在代码中首先检查一个变量的值,然后再基于这个值做一些操作。下面是一个简单的示例:
01
classMyLock {
02
03
privatebooleanlocked = false;
04
05
publicbooleanlock() {
06
if(!locked) {
07
locked = true;
08
returntrue;
09
}
10
returnfalse;
11
}
12
}
上面这段代码,如果用在多线程的程序会出现很多错误,不过现在请忘掉它。
如你所见,lock()方法首先检查locked>成员变量是否等于false,如果等于,就将locked设为true。
如果同个线程访问同一个MyLock实例,上面的lock()将不能保证正常工作。如果一个线程检查locked的值,然后将其设置为false,与此同时,一个线程B也在检查locked的值,又或者,在线程A将locked的值设为false之前。因此,线程A和线程B可能都看到locked的值为false,然后两者都基于这个信息做一些操作。
为了在一个多线程程序中良好的工作,”check then act” 操作必须是原子的。原子就是说”check“操作和”act“被当做一个原子代码块执行。不存在多个线程同时执行原子块。
下面是一个代码示例,把之前的lock()方法用synchronized关键字重构成一个原子块。
01
classMyLock {
02
03
privatebooleanlocked = false;
04
05
publicsynchronizedbooleanlock() {
06
if(!locked) {
07
locked = true;
08
returntrue;
09
}
10
returnfalse;
11
}
12
}
现在lock()方法是同步的,所以,在某一时刻只能有一个线程在同一个MyLock实例上执行它。
原子的lock方法实际上是一个”compare and swap“的例子。
CAS用作原子操作
现在CPU内部已经执行原子的CAS操作。Java5以来,你可以使用java.util.concurrent.atomic包中的一些原子类来使用CPU中的这些功能。
下面是一个使用AtomicBoolean类实现lock()方法的例子:
1
publicstaticclassMyLock {
2
privateAtomicBoolean locked = newAtomicBoolean(false);
3
4
publicbooleanlock() {
5
returnlocked.compareAndSet(false, true);
6
}
7
8
}
locked变量不再是boolean类型而是AtomicBoolean。这个类中有一个compareAndSet()方法,它使用一个期望值和AtomicBoolean实例的值比较,和两者相等,则使用一个新值替换原来的值。在这个例子中,它比较locked的值和false,如果locked的值为false,则把修改为true。
如果值被替换了,compareAndSet()返回true,否则,返回false。
使用Java5+提供的CAS特性而不是使用自己实现的的好处是Java5+中内置的CAS特性可以让你利用底层的你的程序所运行机器的CPU的CAS特性。这会使还有CAS的代码运行更快。
相关推荐
### 并发编程之CAS与Atomic原子操作详解 #### 一、原子操作的概念与意义 在计算机科学领域,原子操作是指一系列的操作被视为一个整体,在执行过程中不会被其他进程或线程打断的操作。简而言之,它确保了一系列操作...
在Java并发编程中,CAS(Compare and Swap)是一种无锁算法,用于在多线程环境中实现对共享变量的原子性更新。相比于传统的锁机制,如`synchronized`和`Lock`,CAS具有更低的开销,因为它避免了线程阻塞。本文将深入...
### 并发编程之CAS详解 #### 一、并发编程基本概念 在开始探讨CAS之前,我们首先简要回顾一下并发编程的一些基本概念。 - **进程**:是计算机中的一个执行单元,它拥有独立的地址空间,是操作系统进行资源分配和...
Java并发编程之CAS详解 CAS(Compare and Swap)是一种常用的并发编程技术,用于实现原子操作。在Java中,CAS技术广泛应用于并发编程中,涉及到CAS使用场景和CAS用作原子操作等内容。 CAS技术的原理 CAS技术的...
06-并发编程之CAS&Atomic原子操作详解-fox 07-并发锁机制之深入理解synchronized(一)-fox 08-并发锁机制之深入理解synchronized(二)-fox 09-深入理解AQS之独占锁ReentrantLock源码分析-fox 10-深入理解AQS之...
Java内存模型是Java并发编程的核心,它定义了共享变量在多线程环境中的行为规则和编程时应遵守的内存交互操作。JMM的目的是在保证并发编程的正确性的同时,最大化CPU利用率。 并发和并行是两个密切相关的概念,也是...
《Java并发编程实战》是Java并发编程领域的一本经典著作,它深入浅出地介绍了如何在Java平台上进行高效的多线程编程。这本书的源码提供了丰富的示例,可以帮助读者更好地理解书中的理论知识并将其应用到实际项目中。...
5. **原子操作与CAS**:`06-并发编程之CAS&Atomic原子操作详解-fox`介绍了CAS(Compare and Swap)和Java的Atomic类。CAS是一种无锁算法,通过硬件指令比较并交换内存位置的值来实现线程安全的操作。Java的Atomic类...
高并发编程第三阶段04讲 利用CAS构造一个TryLock自定义显式锁-增强并发情况下.mp4 高并发编程第三阶段05讲 AtomicBoolean源码分析.mp4 高并发编程第三阶段06讲 AtomicLong源码分析.mp4 高并发编程第三阶段07...
### C++并发编程实践 #### 一、简介与并发编程基础 《C++并发编程实践》这本书由Anthony Williams编写,是一本深入讲解C++多线程编程技术的专业书籍。本书旨在帮助读者掌握C++中的并发编程技巧,并通过大量的示例...
Java并发编程是软件开发中的一个关键领域,尤其是在大型企业级应用和分布式系统中。通过学习相关的书籍,开发者可以深入理解如何有效地设计和实现高效的多线程应用程序,避免并发问题,如竞态条件、死锁、活锁等。...
在Java编程领域,并发编程是一项核心技能,尤其是在大型系统或分布式应用中,高效地处理多线程和并发操作是至关重要的。"Java并发编程与实践"文档深入剖析了这一主题,旨在帮助开发者理解和掌握如何在Java环境中有效...
Java并发编程是Java开发中的重要领域,涉及到多线程、同步机制、线程池等多个核心概念,对于构建高效、稳定的应用至关重要。这份资料包含了关于Java并发编程的博客和网页,可以提供深入的理解和实践指导。 在Java...
《Java虚拟机并发编程》这本书深入探讨了Java平台上的并发处理技术,特别是在Java虚拟机(JVM)上。这本书由知名编程导师Venkat Subramaniam撰写,旨在帮助读者掌握在JVM上进行高效并发编程的技能。 并发编程是现代...
高并发编程第三阶段04讲 利用CAS构造一个TryLock自定义显式锁-增强并发情况下.mp4 高并发编程第三阶段05讲 AtomicBoolean源码分析.mp4 高并发编程第三阶段06讲 AtomicLong源码分析.mp4 高并发编程第三阶段07...
《Java 并发编程实战》是一本针对Java程序员深入学习并发编程的重要著作。这本书涵盖了从基础知识到高级技术的全面内容,旨在帮助读者理解和掌握多线程环境下的编程实践。书中结合了理论与实际示例,提供了丰富的...
Java并发编程是Java开发中的重要领域,特别是在大型分布式系统、多线程应用和服务器端程序设计中不可或缺。这个资源包“Java并发编程从入门到精通源码.rar”显然是为了帮助开发者深入理解并掌握这一关键技能。它包含...
《Java高并发编程》第一版是一本专注于Java平台上的并发编程技术的专业书籍。在Java开发领域,高并发编程是至关重要的技能,特别是在大型分布式系统、云计算以及互联网应用中。本书旨在帮助开发者理解和掌握如何在...
### Java并发编程实践 #### 书籍概述 《Java并发编程实践》是一本由Brian Goetz等人编写的关于Java并发编程的经典著作。本书深入浅出地介绍了Java 5.0及之后版本中新增加的并发特性,并对并发编程进行了全面而详尽...
7. **原子操作与CAS**:Atomic类和CompareAndSwap(CAS)操作是Java并发编程中的无锁技术,用于实现高效且线程安全的数据更新。书中讲解了如何利用这些机制来实现无锁数据结构。 8. **延迟初始化与单例模式**:书中...