ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CAS乐观锁(原子操作)

2020-12-07 23:33:17  阅读:269  来源: 互联网

标签:var5 CAS Unsafe refCnt 原子 乐观 操作


CAS乐观锁(原子操作)

锁主要分为两种:乐观锁和悲观锁,而 synchronized 就属于一种悲观锁,每次在操作数据前都会加锁。乐观锁是指:乐观的认为自己在操作数据时,别人不会对当前数据进行修改,因此不会加锁。如果有人对数据进行了修改,则重新获取修改后的数据,进行操作。直到成功为止。而乐观锁的这种机制就是CAS(compare and swap)比较并交换。

一、什么是 CAS


CAS(Compare And Swap | Compare And Set)**:**比较并交换,CAS 是解决多线程并行情况下使用锁造成性能消耗的一种机制。CAS 操作包含三个操作数:内存位置(V)、预期值(A)、新值(B)。如果内存位置的值(V)与逾期原值(A)相同,处理器会将该位置的值更新为新值(B)则 CAS 操作成功。否则,处理器不做任何更改,只需要将当前位置的值进行返回即可。在 Java 可以通过锁和循环 CAS 的方式来实现原子操作。Java 中 java.util.concurrent.atomic 包相关类就是 CAS 的实现。我们就举一个整数的例子:
【1】**代码解析:AtomicInteger:**通常情况下,在 Java中,i++ 等类似操作并不是线程安全的,因为 i++ 可分为三个独立的操作:获取变量当前值,为该值+1,然后写回新的值。在多线程的情况下 +1000 得到的值往往是不正确的。即使变量被 volatile 修饰,但可以用原子方式 AtomicInteger 自增,这样可以保证数据的原子性。代码如下:

建议:必须具备 volatile 的基本知识,因为 AtomicInteger是 volatile 不具备原子性的解决方案之一。

**getAndIncrement 方法:**如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。

[复制代码](javascript:void(0)

标签:var5,CAS,Unsafe,refCnt,原子,乐观,操作
来源: https://blog.csdn.net/zhengzhaoyang122/article/details/110847693

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有