【并发编程】乐观锁和悲观锁

本文介绍了乐观锁和悲观锁的概念,指出乐观锁在不锁定资源的情况下允许操作,如CAS和自旋锁是其常见实现方式。通过一个AtomicInteger的例子展示了乐观锁的工作流程。同时,讨论了ABA问题及其解决方案,即使用版本号或时间戳确保数据一致性。而悲观锁则在可能的竞争条件下总是加锁,如synchronized和Lock。最后提到了数据库中的乐观锁实现,涉及版本号校验和更新操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程如果锁住了某个资源,致使其他线程无法访问的这种锁被称为悲观锁,相反,线程不锁住资源的锁被称为乐观锁

CAS、自旋锁都是乐观锁的一种实现

private AtomicInteger count = new AtomicInteger(0);

public void syncMethod(){
    boolean swapSuccess = false;
    for(int i=0; i<10; i++){
        int oldVal = count.get();
        int newVal = old + 1;
        swapSuccess = flag.compareAndSet(oldVal, newVal);
        if(swapSuccess){
            break;
        }
    }
    System.out.println("替换成功标记:" + swapSuccess);
}

乐观锁的本质,通过条件判断来决定是否执行操作

ABA 问题解决:

乐观锁的实现:版本号、时间戳

  1. 获取数据
  2. 修改数据
  3. 提交前进行版本检测,版本无变化则提交成功
  4. 提交失败则重复步骤1

悲观锁

synchronized、lock,不管是否存在竞态条件,都会加锁

数据库乐观锁

  1. 先查询数据
  2. 对数据进行修改
  3. update 的时候 where 条件里需要带版本号,且 update 需要对版本号进行修改
  4. 返回受影响的行数,通过行数判断是否修改成功
  5. 如果未修改成功重复步骤1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值