Java学习:乐观锁与悲观锁详解
需积分: 10 79 浏览量
更新于2024-09-03
收藏 245KB PDF 举报
账户余额中扣减$50,得到新的balance=$50,同时version加1,变成version=2。
2.操作员B同时读取该账户信息(version=1),并尝试从余额中扣减$30,得到新的balance=$70,同时version加1,变为version=2。
3.操作员A提交更新,将balance=$50和version=2回写到数据库,由于version=2与数据库中的version值相等,更新成功。
4.操作员B提交更新,尝试将balance=$70和version=2回写到数据库,但由于此时数据库中的version已经变为3(操作员A的更新导致),所以操作员B的更新会被拒绝,因为它的version值(2)与数据库中的version值(3)不一致。
2.CAS(Compare and Swap,比较并交换)
CAS算法是一种无锁算法,用于实现乐观锁。它包含三个操作数——内存地址V、旧的预期值A和新值B。当且仅当预期值A和内存地址V上的实际值相同时,将内存地址V上的值更新为B,否则不做任何操作。在Java中,`AtomicInteger`、`AtomicLong`等原子类就使用了CAS算法来保证数据的一致性。
在实际应用中,如何选择悲观锁还是乐观锁?
- 如果应用程序中读操作远多于写操作,乐观锁可以提高并发性能,因为它减少了锁定资源的时间,从而减少了线程间的等待。比如缓存更新、读多写少的计数器等场景。
- 如果写操作频繁,乐观锁可能导致大量重试,反而降低了系统性能,此时悲观锁更适合,它可以确保在写操作时不会发生数据的冲突,如银行转账操作,需要保证事务的隔离性和一致性。
在Java并发编程中,根据业务场景选择合适的锁策略是非常重要的。如果需要精确控制并发,可以选择悲观锁,例如使用`synchronized`关键字或者`java.util.concurrent.locks.ReentrantLock`。如果追求高并发性能,并且能接受一定的冲突重试,那么乐观锁如`java.util.concurrent.atomic`包下的原子类则是更好的选择。
理解悲观锁和乐观锁的概念及其适用场景,有助于我们在设计并发程序时做出更合理的决策,以提高系统的性能和稳定性。
点击了解资源详情
131 浏览量
点击了解资源详情
131 浏览量
2023-04-12 上传
2022-12-20 上传
196 浏览量
122 浏览量
118 浏览量
星辰引路-Lefan
- 粉丝: 932
- 资源: 130