Java线程(十):CAS
来源:互联网 发布:淘宝美工详情页教程 编辑:程序博客网 时间:2024/05/04 19:38
版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/ghsau。
目录(?)[+]
前言
在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线程之CAS(Atomic)
- Java线程(十)
- 0097 Java线程:CAS原子性【进阶】
- Java线程 - CAS自旋锁(spin-lock)
- Java并发学习(十)-CAS中ABA问题解决方法
- Java线程(十)-死锁
- JAVA线程并发性之CAS算法,模拟实现代码
- java cas
- Java cas
- java CAS
- Java中的线程(十)- condition lock
- Uubuntu设置静态ip
- 欢迎使用CSDN-markdown编辑器
- spring-mvc 搭建
- [算法学习]求出链表中倒数第n个节点
- 多路复用与非阻塞与异步
- Java线程(十):CAS
- 装饰器模式(Decorator )
- 获取字符串中指定位置开始的指定长度的字符串,支持汉字英文混合 汉字为2字节计数
- POJ 1286 Necklace of Beads
- [算法学习]求链表的中间结点
- 外观模式——统一编程接口
- oracle开发规范
- CSS clear both清除浮动
- Android 进程间通信之AIDL