知识点: JAVA 悲观锁与乐观锁原理分析 ABA与自旋效率问题分析及解决

本文介绍了Java中的悲观锁与乐观锁的概念和应用场景,重点分析了乐观锁中的ABA问题及其解决方案,并探讨了自旋锁的效率问题。Java原子类如AtomicInteger使用CAS算法实现,但可能面临ABA问题和自旋效率问题。文章还提出了替换方案,如使用读写锁和自适应自旋锁来解决相应问题。
摘要由CSDN通过智能技术生成

本文知识:

悲观锁与乐观锁原理

ABA问题原理与解决方案

自旋锁原理与问题分析

前言

Java中提供了丰富的锁,每种锁因其特性不同,在适当的场景下展现出非常高的效率,本篇文章旨在通过源码分析、使用场景来讲解Java各种锁以及各种锁适用的场景。

通过对锁的不同含义、适用场景做了如下归类:

悲观锁与乐观锁

悲观锁与乐观锁是一种广义上的锁,体现在看待锁的角度不相同。在Java与数据库中都有广泛的应用。

先来说说悲观锁与乐观锁的概念吧:

  1. 悲观锁在获取一个资源时不管当前有没有其它的线程在修改或者读取,都需要先获取到资源的锁,获取锁成功后再读取或者修改数据,完成后释放锁。
  2. 乐观锁认为在获取一个资源时当前没有其它线程进行修改或者更新数据,直接读取数据;需要修改数据时先看当前数据有没有被修改,没有修改时获取锁后再进行修改,如果修改时数据被修改则执行事先制定的策略例如失败或者重试。

乐观锁与悲观锁的操作数据时都需要获取资源锁,主要区别在于悲观锁不管什么情况下都先获取锁,而乐观锁会根据当前资源的情况进行判断后再获取锁。

Java中实现乐观锁的方法一般采用CAS算法,原子类中的递增就是通过CAS算法自旋实现。

image-20210607214904334

通过对悲观锁与乐观锁的锁流程分析可以得出它们分别较适用的场景:

  • 悲观锁适用于写操作较多读操作较少的场景,在悲观锁的世界里读与写都需要获取锁后操作,不会出现脏读。
  • 乐观锁适合用于读多写少的场景,会再现脏读的情况,在有大量写操作时效率会有所下降

下面来看看Java中对悲观锁与乐观锁的应用:

Long value= 0L; //需要同步的资源
//使用悲观锁 synchronized
synchronized (value){
   
  value++;
}
ReentrantLock lock=new ReentrantLock()
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值