Java学习:乐观锁与悲观锁详解

需积分: 10 0 下载量 153 浏览量 更新于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`包下的原子类则是更好的选择。 理解悲观锁和乐观锁的概念及其适用场景,有助于我们在设计并发程序时做出更合理的决策,以提高系统的性能和稳定性。