乐观锁与悲观锁

乐观锁:
每次拿到数据的时候都不会进行上锁,在更新的时候会判断一下在此期间该数据有没有进行变更。

实现机制
乐观锁的实现主要有两种,一种是版本号控制,另一种是CAS算法实现。
版本号控制:
一般是在一个数据表中加上一个数据版本号字段,表示数据被修改的次数,当数据被修改的时候,该版本号字段会进行加1的操作。当某一个线程要对一个字段进行修改的时候,会在读取数据的同时读取版本号的值,在提交更新的时候,若版本号的值与之前的版本号的值不同的时候,便会重新进行更新操作。
CAS机制:
线程在读取数据时不进行加锁,在准备写回数据时,先去查询原值,操作的时候比较原值是否修改,若未被其他线程修改则写回,若已被修改,则重新执行读取流程。一般情况下是一个自旋操作,即不断的重试。

乐观锁缺点:
1.循环时间长造成开销问题:cas的自选操作
2.ABA问题:使原来的A数据变为不是原来的相同的A数据
3.只能保证一个共享变量的原子操作
CAS操作单个共享变量的时候可以保证原子的操作,多个变量就不行了。

悲观锁:
共享资源每次只给一个线程使用,其他的线程将会被阻塞,用完之后再把资源转让给其他的线程。

synchronized,代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、 D等)正在用这个方法(或者该类的其他同步方法),有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,锁定调用者,然后直接运行。

悲观锁缺点:
假设最坏的情况,每次去读数据的时候都认为别人会修改,所以每次在读数据的时候都会上锁,增大系统的性能开销
两种锁的使用场景
乐观锁适用于多读的场景,提高吞吐量
悲观锁适用于写比较多的情况下(多写场景,冲突一般较多)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值