目录
写在前面
这一部分内容,对实际开发其实用处不大,但是在校招中是一个极其高频的考点,也就是我们所说的“八股文”内容,这部分内容,能理解掌握最好,不能理解掌握,背下来也可以,但是我的初心是用最简洁直白的文字描述清每一个知识点,争取让大家都掌握到这些知识点。所以我会尽可能的详细介绍这些策略,力求让大家不需要死记硬背也可以牢牢掌握。
一、乐观锁 VS 悲观锁
锁的实现者,通过预测接下来锁冲突(锁竞争,前文介绍过的抢厕所例子)的概率是大还是不大,根据这个冲突的概率,来决定接下来该咋做。
乐观锁和悲观锁最终要做的事情是不一样的
以刚经历过的疫情为例:网络上根据即将要放开的政策大致分为了两个派系:
- 乐观派:认为放开也没什么事,生活会恢复正常,除了基本的戴口罩以外不做任何防护策略。
- 悲观派:认为放开会对自己生活产生很大影响,生活不会恢复正常,除了戴口罩以外还买了消毒酒精、粮食、药物,还自主隔离等等措施
这里两个派系应对同一事情做出的不同反应就类似于乐观锁和悲观锁
- 乐观锁:所做的工作会少一些,效率更高。
- 悲观锁:所做的工作会多一些,效率更低。
二、轻量级锁 VS 重量级锁
字面上来解读:
轻量级锁更为轻量,重量级锁更为重量,这里的轻量重量体现在加锁解锁上,它和上面的乐观悲观锁有一定重合但不是一回事
- 一个乐观锁很可能也是一个轻量级锁
- 一个悲观锁很可能是一个重量级锁
这并不绝对,只是可能性较大
轻量级锁是用户态操作,重量级锁会交给内核阻塞等待
三、自旋锁 VS 挂起等待锁
自旋锁是轻量级锁的一种典型实现,挂起等待锁是重量级锁的一种典型实现。
举一个生动形象的例子:沸羊羊
即便美羊羊已经明确表示沸羊羊只是个好人,但是沸羊羊仍然锲而不舍的每天关心问候美羊羊,这就是一个典型的自旋锁,加锁失败后,这个锁不会去做别的事情,而是锲而不舍的在此空转,直到美羊羊失恋,沸羊羊就可以第一时间乘虚而入,拿下美羊羊。
那么沸羊羊应该怎么样做才能体面一点呢,那就是从自旋锁变成挂起等待锁,当美羊羊表示对它没意思的时候,它可以先去做别的事情提高自己,等待美羊羊被喜羊羊伤透了心时,回过头来发现沸羊羊已经变的非常优秀,它自然就会接受沸羊羊了,这里沸羊羊被拒绝后不在围着美羊羊转,而是去做自己的事情,就是一个典型的挂起等待锁
自旋锁:一旦锁被释放,自旋锁可以第一时间拿到锁,速度会更快,但缺点是这个锁会一直消耗cpu空转等待(忙等)。通常是纯用户态操作,不需要经过内核态
挂起等待锁:如果锁被释放,不能第一时间拿到锁。通过内核的机制来挂起等待,时间更长。
并发控制:锁的策略与类型解析

本文介绍了并发编程中的各种锁机制,包括乐观锁与悲观锁的概念,轻量级锁和重量级锁的区别,自旋锁与挂起等待锁的实现方式,以及互斥锁和读写锁的使用场景。此外,文章讨论了可重入锁和不可重入锁的特点,并详细阐述了公平锁与非公平锁的选择。文章还分析了死锁的问题及解决思路,并特别提到了Java中的`synchronized`关键字的锁行为和自适应策略。
最低0.47元/天 解锁文章





