咨询热线:15251699689 联系人:李钊磊 地址:乐清市七里港工业区
无锁的同步策略——CAS操作详解
来源:老子有钱858APP 发布时间:2019-11-16 点击量:342
1. 从乐观锁和悲观锁谈起
乐观锁和悲观锁是两种不同的解决并发问题的策略。悲观锁策略假定任何一次并发都会发生冲突,所以总是采用最严格的方式来进行并发控制。java中的独占锁(synchronized和重入锁)就是典型悲观锁实现,它只允许线程互斥的访问临界区,也就是阻塞式的同步方式。而乐观锁策略假定大部分情况下并发冲突不会发生,采用的是一种更为宽松的方式来进行并发控制。比如我们马上就要讲的CAS操作。它允许多线程非阻塞式地对共享资源进行修改,但同一时刻只有一个线程能够成功,其他线程被告知失败但并不会挂起,而是重新尝试。这是一种非阻塞式的同步方式。
2. CAS详解
Java中的CAS操作依赖于底层CPU的CAS指令。
2.1 CAS指令
CAS,即Compare-and-Swap(比较和交换),从语义上它需要两次操作,但只需要一条cpu指令就能完成,因而该操作具有原子性,像原子一样不可分割,要么成功,要么失败。CAS指令需要3个操作数,分别是V:变量的内存地址,A(预期值),B(更新值)。CAS指令执行时,只有当预期值A和V的值一样时才进行更新,否则更新失败。
2.3 Java中的CAS指令
java中给我们提供了本地方法来获得和CAS指令一样的执行效果。比如Unsafe类中
public final native boolean compareAndSwapObject(Object var1, long var2, Object var4, Object var5);public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);public final native boolean compareAndSwapLong(Object var1, long var2, long var4, long var6);
因为这些方法会被编译成平台相关的CAS指令,故而这些CAS操作都具有原子性。遗憾的是,这些CAS操作我们无法直接使用,因为只有Bootstrap ClassLoader加载的Class才能访问它。然而在JDK并发包的底层实现中,还是可以处处看到它的身影。如下图所示
2.4 CAS结合失败重试机制进行并发控制
CAS指令只是提供了一个更新变量的原子操作,要使用它进行并发控制,还需要结合失败重试机制。以AtomicInteger为例,对它进行累加操作是线程安全的,而普通的整型变量在多线程环境下执行类似i++的操作线程不安全。为什么?因为i++并非是一个原子操作,而AtomicInteger类的getAndIncrement
底层的CAS操作是原子性的,故而能保证线程安全。下面是它的源码(基于JDK8)
/** * Atomically increments by one the current value. * * @return the updated value */public final int incrementAndGet() { return unsafe.getAndAddInt(this, valueOffset, 1) + 1;}
进入方法Unsafe类的getAndAddInt
方法,
public final int getAndAddInt(Object var1, long var2, int var4) { int var5; do { var5 = this.getIntVolatile(var1, var2); //获得变量当前的值 } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4)); //CAS失败则重新尝试直到成功为止 return var5;}
可以看到步骤可以概括为
1.获得变量当前的值var52.使用CAS操作进行更新:若var5与当前的值不一样,说明1,2操作间有其他线程作了修改,此次更新失败,重新实行步骤1;否则用 var5+var4的值进行更新,并返回更新前的值。多个线程同时使用CAS指令去更新变量,失败的线程将会不断重新尝试,直到更新成功。3. CAS操作的优势和劣势
3.1 CAS相比独占锁的优势
没有线程阻塞唤醒带来的性能消耗问题。3.2 CAS的缺点
ABA问题。在CAS操作时,我们以变量的当前值和预期值一致来判定变量未被其他线程修改,这样是不用严谨的,因为变量可能被修改成其他值后又被改了回来,大部分时候这是个可以忽略的小问题,如果要规避这个问题,可以使用AtomicStampedReference,它会额外使用一个时间戳来判断变量是否被修改过。无法直接使用CAS来进行并发控制,相比同步锁的方式适用范围较窄。4. 总结
CAS是CPU的一条指令,用来对变量进行原子更新。java中使用CAS技术结合失败重试机制,可以非阻塞的实现多线程对共享资源的并发修改,很多时候具有比独占锁更好的性能。
, 1, 0, 9);相关产品
-
但是,20年过去,以上6家企业可以用“冰火两重天”来形容。江淮在当时的“小伙伴们”,多被“四大集团”兼并重组,仍能保持“自由之身”的惟有江淮和庆铃。所以,两者之间也许最具可比性。
-
而在上海,不少经销商纷纷表示:“这个市场越来越不好做,客户觉得车子太小,不实用。从品牌力和产品本身,以及厂家的市场投放力度来说,上海地区能卖好的,可能只有广汽本田的缤智,其它情况可能会不大理想。”
-
随着食品超市加盟的走热,华人加盟商也开始走出超市这一行,向餐饮行业的日本餐等领域发展,而且速度极快。据了解,仅就家乐福内的寿司日本餐连锁这一项,在前年短短的一年时间内,西班牙就出现了二十多家由华人加盟的连锁店。
-
IT之家11月27日消息 由于价格足够便宜,功能也够用,搭载谷歌Chrome OS的Chromebook越来越成为Windows或者macOS的有力替代品,尤其是在教育市场。大家可能知道,已经有很多型号的Chromebook支持运行从Google Play商店下载的安卓应用程序,这听起来很棒,然而长久以来,在Chromebook的Google Play商店里,有这样一套重量级的应用缺席,它就是微软Office。
-
现在一些临摹世界名画的“行画”,价格高的也要卖到几千块,但行画是没有收藏价值的。而同样的价格,却能够买到一件和博物馆收藏的作品同样的原作,而且还能不断地升值,这就是版画最大的价值。而且当代版画的装饰性和现代感很强,跟现代办公、家居的搭配非常协调,所以市场非常大。
-
不要小看甘王这3分的酸味,这正是它的魅力所在。一般来说草莓总是越甜越受欢迎,有些高级品种能甜得像甜点心一样,而甘王不管种得多好、糖度多高,果实总能尝出恰到好处的酸味,配合浓郁的草莓香,令人一个接一个地停不下来,回过神时盘中只剩果蒂。
-
据彭博社报道,今年2月份,黄金ETP(交易所交易产品)的单月资金流出量创下历史新高,达到54亿美元。与此同时,对冲基金经理的做空行为也在一定程度上加剧了金价的跌势。
-
同时在常住户籍人口比过低的城市中,极少出现外地购房客户占比高的情况,如遵义、衢州、龙岩等,此类城市大多整体经济发展情况一般,对人口吸引能力弱,或是处于人口流失的阶段,对外部购房者的吸引力也不高。
热点资讯
- 日本因地震取消国际友谊赛日本vs智利一战比赛2019-11-15
- 《王者荣耀》AR相机功能来袭:首批安卓OPPO独享2019-11-14
- 十分钟看完毒液游戏形象进化史:恐怖反派依旧霸气十足2019-07-17
- 用艺术的魅力感恩丰收的农民2019-07-17
- 谷歌在安卓系统预装自家App也要被罚,还高达数十亿美元2019-07-17
- 美国、加拿大、澳大利亚和新西兰的房地产市场进入低速壁垒,使中国买家转向新兴市场。2019-07-17
- 热点预告:逆水寒与天刀刚正面武侠党你会选择谁?2019-10-29
- 证监会祝贺改革先驱、资本市场发展实践者于国刚所做的这些工作。2019-07-17