原子操作CAS
程序员文章站
2022-03-08 17:52:09
...
一、原子操作
原子操作(atomic operation)
不需要 synchronized
。原子操作指的是不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch
(切换到另一个线程)。
二、什么是CASCAS
是compare and swap
的缩写,即比较交换
。CAS
是乐观锁。在java中锁分为乐观锁
和悲观锁
。悲观锁
是将资源锁住,等一个之前获得锁的线程释放锁之后,下一个线程才可以访问。而乐观锁
采取了一种宽泛的态度,通过某种方式不加锁来处理资源,性能
较悲观锁
有很大的提高。
三、CAS算法思想
指令级别保证这是一个原子操作:CAS
其底层是通过CPU
的1条指令
来完成3个步骤
,因此其本身是一个原子性操作
,不存在其执行某一个步骤的时候而被中断
的可能。
CAS(v, e , n)
- v : 表示要更新的变量
- e : 表示变量的预期值
- n : 表示变量的新值
当且仅当 v 的实际值等于 e 值时, 才会将 v 的值设为 n
如果 v 值和 e 值不同,则说明已经有其他线程做了更新,那么当前线程什么都不做,即更新失败。
CAS操作是抱着乐观的态度进行的,它总是认为自己可以成功完成操作。
当多个线程同时使用CAS操作一个变量时,只有一个会胜出,并成功更新,其余均会失败。
失败的线程不会被挂起,仅是被告知失败,并且允许再次尝试,当然也允许失败的线程放弃操作。
四、CAS的优缺点优点
- 并发量不是很高时CAS机制会提高效率
- 在一般情况下,性能优先于锁的使用
缺点
- CPU消耗大,CAS线程会不停自旋,如果并发量大的话,将会不停重试,还不释放CPU,极端情况下会耗光资源。
- 只能保证某个变量的原子操作(这里可以用并发包里面的原子更新类AtomicReference实现)
- ABA问题 (在JAVA并发包里面AtomicStampedReference类用了版本号来解决ABA问题)。
- 它将使调用者处理竞争问题(通过重试、回退、放弃),而在锁中能自动处理竞争问题。
五 、原子操作类使用场景
使用原子操作代替synchronized加锁
上一篇: MySQL基础学习笔记