悲观锁与乐观锁
本文知识:
悲观锁与乐观锁原理
ABA问题原理与解决方案
自旋锁原理与问题分析
前言
Java中提供了丰富的锁,每种锁因其特性不同,在适当的场景下展现出非常高的效率,本篇文章旨在通过源码分析、使用场景来讲解Java各种锁以及各种锁适用的场景。
通过对锁的不同含义、适用场景做了如下归类:

悲观锁与乐观锁
悲观锁与乐观锁是一种广义上的锁,体现在看待锁的角度不相同。在Java与数据库中都有广泛的应用。
先来说说悲观锁与乐观锁的概念吧:
- 悲观锁在获取一个资源时不管当前有没有其它的线程在修改或者读取,都需要先获取到资源的锁,获取锁成功后再读取或者修改数据,完成后释放锁。
- 乐观锁认为在获取一个资源时当前没有其它线程进行修改或者更新数据,直接读取数据;需要修改数据时先看当前数据有没有被修改,没有修改时获取锁后再进行修改,如果修改时数据被修改则执行事先制定的策略例如失败或者重试。
乐观锁与悲观锁的操作数据时都需要获取资源锁,主要区别在于悲观锁不管什么情况下都先获取锁,而乐观锁会根据当前资源的情况进行判断后再获取锁。
Java中实现乐观锁的方法一般采用CAS算法,原子类中的递增就是通过CAS算法自旋实现。

通过对悲观锁与乐观锁的锁流程分析可以得出它们分别较适用的场景:
- 悲观锁适用于写操作较多读操作较少的场景,在悲观锁的世界里读与写都需要获取锁后操作,不会出现脏读。
- 乐观锁适合用于读多写少的场景,会再现脏读的情况,在有大量写操作时效率会有所下降
下面来看看Java中对悲观锁与乐观锁的应用:
Long value= 0L; //需要同步的资源
//使用悲观锁 synchronized
synchronized (value){
value++;
}
ReentrantLock lock=new ReentrantLock()

本文介绍了Java中的悲观锁与乐观锁的概念和应用场景,重点分析了乐观锁中的ABA问题及其解决方案,并探讨了自旋锁的效率问题。Java原子类如AtomicInteger使用CAS算法实现,但可能面临ABA问题和自旋效率问题。文章还提出了替换方案,如使用读写锁和自适应自旋锁来解决相应问题。
最低0.47元/天 解锁文章
1623

被折叠的 条评论
为什么被折叠?



