Java:乐观锁与悲观锁

1. 乐观锁

1.1 定义

总是认为不会产生并发安全问题,每次读取数据的时候总认为不会有其他线程对数据进行修改,因此不会上锁。但在更新操作时,会判断其他线程在这之前有没有并发线程对数据进行修改

1.2 实现方式:

版本号(version)方式:
一般是在数据表中加上一个数据版本号version字段,以此表示数据被修改的次数,当数据被修改时,version值进行变化(自增)。当线程更新数据时,读取数据的同时也会读取当前version的值,在提交更新时,需要判断刚才读取到的version的值与当前version的值相等时才会更新成功。
CAS算法:
Compae And Swap,比较与交换,一种无锁算法,即在不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,也叫非阻塞式同步

  • 需要读写的内存值 V
  • 进行比较的值 A
  • 拟写入的新值 B

当且仅当 V 的值等于 A时,CAS通过原子方式用新值B来更新V的值,否则不会执行任何操作(比较和替换是一个原子操作)。一般情况下是一个自旋操作,即不断的重试

1.3 适用场景

适用写比较少的情况,即多读的情况下,可以省去锁的开销

2.悲观锁

2.1 定义

总是假设最坏的并发安全情况,认为每次读取数据时其他线程会进行修改,所以都会加锁(读锁,写锁,行锁等)来保证线程安全,当其他线程想要访问数据时,都需要阻塞挂起

2.2 实现方式

行锁,表锁等,读锁,写锁等
synchronized
ReentrantLock

2.3 适用场景

多写的场景下,用悲观锁保证线程安全

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值