乐观锁-cas操作

CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。 如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值 。否则,处理器不做任何操作。无论哪种情况,它都会在 CAS 指令之前返回该 位置的值。(在 CAS 的一些特殊情况下将仅返回 CAS 是否成功,而不提取当前 值。)CAS 有效地说明了“我认为位置 V 应该包含值 A;如果包含该值,则将 B 放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。”
在这里插入图片描述

通常将 CAS 用于同步的方式是从地址 V 读取值 A,执行多步计算来获得新 值 B,然后使用 CAS 将 V 的值从 A 改为 B。如果 V 处的值尚未同时更改,则 CAS 操作成功。

当然这里也有一个弊端,如果线程A在执行过程中,B和C线程都对这个值进行了操作,并且C线程将这个值又改回来了,那么A线程并不会察觉到改变。
在这里插入图片描述
参考文献:https://www.cnblogs.com/barrywxx/p/8487444.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ConcurrentHashMap是Java中的一个线程安全的哈希表实现,它在并发环境下提供了高效的操作。它的锁机制是基于分段锁实现的。 分段锁是指ConcurrentHashMap将整个数据结构分成若干个段(Segment),每个段都是一个独立的HashMap。不同的线程可以同时访问不同的段,从而实现并发访问。在对每个段进行操作时,需要获取该段对应的锁,只有获取到锁的线程才能进行更新操作。 但是,在JDK 8之后的版本中,ConcurrentHashMap的分段锁被修改为了CAS(Compare and Swap)操作来实现并发安全。 CAS是一种乐观锁的实现方式,它允许多个线程同时对一个变量进行读操作,但在更新时需要进行原子性的比较和交换。它通过比较当前对象的值与预期值是否相等来确定是否可以进行更新操作。如果相等,则使用新值进行更新;如果不相等,则说明其他线程已经先一步进行了更新操作,当前线程需要重新读取最新值再进行尝试。 使用CAS操作来替代分段锁可以提高并发性能,因为CAS操作不需要加锁和解锁的开销。但是CAS操作也存在一些问题,例如ABA问题,即在读取和修改之间可能有其他线程对该对象进行了修改导致值发生变化。为了解决这个问题,JDK在CAS的基础上引入了带有版本号的StampedLock来提供更强的并发安全性。 总结来说,ConcurrentHashMap在JDK 8之后使用CAS操作替代了分段锁来提高并发性能,但仍需要处理一些并发安全问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值