共计 646 个字符,预计需要花费 2 分钟才能阅读完成。
CAS
Compare and Swap 先比拟再替换,CAS 是一种无锁优化算法,也能够说是乐观锁,它基于共享数据不会被批改的假如,CAS 有 3 个操作数,内存值 V,旧的预期值 A,要批改的新值 B,当且仅当预期值 A 和内存值 V 雷同时,将内存值批改为 B,否则什么都不做。
CAS 的实现原理
1. 在 java 层面,提供 CAS 的办法是在 Unsafe 类中应用 native 润饰的:
2.native 是间接调用本地依赖库 C ++ 中的办法
3. 在 CAS 底层,如果是多核的操作系统,须要追加一个 lock 指令,单核不须要加,因为 cmpxchg 是一行指令,不能再被拆分了
cmpxchg,是汇编的指令,CPU 硬件底层就反对 比拟和替换(cmpxchg),cmpxchg 并不保障原子性的。(cmpxchg 的操作是不能再拆分的指令)
所以才会呈现判断 CPU 是否是多核,如果是多核就追加 lock 指令。
lock 指令你能够了解为是 CPU 层面的锁,个别锁的粒度就是 缓存行 级别的锁,当然也有 总线锁,然而老本太高,CPU 会依据状况抉择。
CAS 中存在的问题
1.ABA
对于一般数据类型 ABA 不肯定是问题,因为他不会影像线程执行的最终后果。对于援用数据类型,能够指定版本号来解决,Java 中的 atomic 包里提供了一个类 AtomicStampedReference 就是这样的。
2. 自旋次数过长
如果 CAS 始终不胜利,自旋次数很大,会给 CPU 带来十分大的开销,能够限度自旋次数,比方 synchronized,CAS 失败肯定次数后,就会将线程挂起,防止占用过多的 CPU 资源。
正文完