Java线程(十)----CAS
来源:互联网 发布:大守护者升级数据 编辑:程序博客网 时间:2024/05/18 14:22
前言
在Java并发包中有这样一个包,java.util.concurrent.atomic,该包是对Java部分数据类型的原子封装,在原有数据类型的基础上,提供了原子性的操作方法,保证了线程安全。下面以AtomicInteger为例,来看一下是如何实现的。
以这两个方法为例,incrementAndGet方法相当于原子性的++i,decrementAndGet方法相当于原子性的--i(根据第一章和第二章我们知道++i或--i不是一个原子性的操作),这两个方法中都没有使用阻塞式的方式来保证原子性(如Synchronized),那它们是如何保证原子性的呢,下面引出CAS。
Compare And Swap
CAS 指的是现代 CPU 广泛支持的一种对内存中的共享数据进行操作的一种特殊指令。这个指令会对内存中的共享数据做原子的读写操作。简单介绍一下这个指令的操作过程:首先,CPU 会将内存中将要被更改的数据与期望的值做比较。然后,当这两个值相等时,CPU 才会将内存中的数值替换为新的值。否则便不做操作。最后,CPU 会将旧的数值返回。这一系列的操作是原子的。它们虽然看似复杂,但却是 Java 5 并发机制优于原有锁机制的根本。简单来说,CAS 的含义是“我认为原有的值应该是什么,如果是,则将原有的值更新为新值,否则不做修改,并告诉我原来的值是多少”。(这段描述引自《Java并发编程实践》)
简单的来说,CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则返回V。这是一种乐观锁的思路,它相信在它修改之前,没有其它线程去修改它;而Synchronized是一种悲观锁,它认为在它修改之前,一定会有其它线程去修改它,悲观锁效率很低。下面来看一下AtomicInteger是如何利用CAS实现原子性操作的。
volatile变量
Compare And Set
循环设置
缺点
- Java线程(十)----CAS
- Java线程(十):CAS
- Java线程(十):CAS
- Java线程(十):CAS
- Java线程(十):CAS
- Java线程(十):CAS
- Java线程(十):CAS
- Java线程(十)
- Java线程(十)-死锁
- Java线程之CAS(Atomic)
- Java中的线程(十)- condition lock
- java系统学习(十) --------线程
- java并发(二十)线程池
- 0097 Java线程:CAS原子性【进阶】
- Java线程 - CAS自旋锁(spin-lock)
- Java并发学习(十)-CAS中ABA问题解决方法
- 黑马程序员--Java基础学习十(Java线程)
- (二十)线程
- 909422229________JDBC关于转账问题事务解决
- 需求拆分到设计流程总览
- 36. Valid Sudoku, leetcode
- 6 XML和Tomcat的入门知识
- hadoop 2.7.3 源码分析(三):hadoop远程调试
- Java线程(十)----CAS
- Cannot open precompiled header file: 'Debug/****.pch': No such file or directory
- Java线程(十一)----Fork/Join-Java并行计算框架
- UMl——静态图
- 记一次坑爹的内存不足troubleshooting
- 虚函数
- Activity生命周期
- VBA,我的第一门语言(带你走进VBA的世界)
- spring之外部化配置