Java中乐观锁与悲观锁,即互斥同步锁与非互斥同步锁

本文深入探讨了乐观锁和悲观锁的概念,分析了两者的优缺点,包括阻塞和唤醒带来的性能开销、永久阻塞问题、优先级反转问题以及线程自旋的CPU性能开销。并讨论了它们在不同场景下的适用性,如并发写入多或少的情况,以及IO操作和代码量大的场景。

乐观锁又叫非互斥同步锁,悲观锁又叫互斥同步锁。

悲观锁的劣势

  • 阻塞和唤醒带来的性能开销。
  • 永久阻塞问题。如果持有锁的线程发生无限循环或者死锁等活跃性的问题,那么等待获取锁执行的线程将无法执行。
  • 优先级反转问题。如果我们设置了优先级,当优先级高的线程需要等待优先级低的线程锁的时候,会让线程的优先级反转。

悲观锁概念

持悲观态度,认为每次执行这个同步资源的时候都会有线程争抢这个资源,如果不锁住就会发生错误。所以每次执行时都会锁住,让其他人等待执行完成释放锁后在拿到锁再执行。如synchronizedLock接口相关类

乐观锁概念

持乐观态度,认为每次执行这个同步资源的时候都没有线程争抢这个资源。所以执行时不会锁住资源,在更新时会对比我修改期间数据有没有被别人修改过,如果数据与开始一致,证明只有我们自己在操作,就正常修改数据;如果数据与开始不一致,证明有人修改过,那么就不会修改数据,执行放弃、报错、重试等相关策略。如CAS算法实现的相关操作,原子类、并发容器等。git中push操作也是乐观锁,push时如果有人版本号领先我们,则提交失败。

开销对比

  • 悲观锁的开销主要是线程阻塞唤醒带来的性能开销。
  • 乐观锁的开销主要是线程自旋所带来的cpu性能开销。

使用场景

悲观锁适用于并发写入多的情况,适用于持有锁时间比较长的情况,悲观锁可以避免线程自旋的性能开销。

  • IO操作
  • 代码量大,逻辑比较多,相对来说比较耗时
  • 并发大,线程竞争激烈。

乐观锁适用于并发写入少,大部分是读取数据的场景。

相关文章

Java中锁的分类及概念

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值