[08]从零开始的JAVAEE-常见锁策略(八股文内容)

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

目录

写在前面

一、乐观锁 VS 悲观锁

二、轻量级锁 VS 重量级锁

三、自旋锁 VS 挂起等待锁

四、互斥锁 VS 读写锁

五、可重入锁 VS 不可重入锁

六、公平锁 VS 非公平锁

死锁

哲学家就餐问题

死锁的四个必要条件

解决死锁问题的思路

sychronized是什么样的锁?


写在前面

这一部分内容,对实际开发其实用处不大,但是在校招中是一个极其高频的考点,也就是我们所说的“八股文”内容,这部分内容,能理解掌握最好,不能理解掌握,背下来也可以,但是我的初心是用最简洁直白的文字描述清每一个知识点,争取让大家都掌握到这些知识点。所以我会尽可能的详细介绍这些策略,力求让大家不需要死记硬背也可以牢牢掌握。

一、乐观锁 VS 悲观锁

锁的实现者,通过预测接下来锁冲突(锁竞争,前文介绍过的抢厕所例子)的概率是大还是不大,根据这个冲突的概率,来决定接下来该咋做。

乐观锁和悲观锁最终要做的事情是不一样的

以刚经历过的疫情为例:网络上根据即将要放开的政策大致分为了两个派系:

  • 乐观派:认为放开也没什么事,生活会恢复正常,除了基本的戴口罩以外不做任何防护策略。
  • 悲观派:认为放开会对自己生活产生很大影响,生活不会恢复正常,除了戴口罩以外还买了消毒酒精、粮食、药物,还自主隔离等等措施

这里两个派系应对同一事情做出的不同反应就类似于乐观锁和悲观锁

  • 乐观锁:所做的工作会少一些,效率更高。
  • 悲观锁:所做的工作会多一些,效率更低。

二、轻量级锁 VS 重量级锁

字面上来解读:

轻量级锁更为轻量,重量级锁更为重量,这里的轻量重量体现在加锁解锁上,它和上面的乐观悲观锁有一定重合但不是一回事

  • 一个乐观锁很可能也是一个轻量级锁
  • 一个悲观锁很可能是一个重量级锁

这并不绝对,只是可能性较大

轻量级锁是用户态操作,重量级锁会交给内核阻塞等待

三、自旋锁 VS 挂起等待锁

自旋锁是轻量级锁的一种典型实现,挂起等待锁是重量级锁的一种典型实现。

举一个生动形象的例子:沸羊羊

即便美羊羊已经明确表示沸羊羊只是个好人,但是沸羊羊仍然锲而不舍的每天关心问候美羊羊,这就是一个典型的自旋锁,加锁失败后,这个锁不会去做别的事情,而是锲而不舍的在此空转,直到美羊羊失恋,沸羊羊就可以第一时间乘虚而入,拿下美羊羊。

那么沸羊羊应该怎么样做才能体面一点呢,那就是从自旋锁变成挂起等待锁,当美羊羊表示对它没意思的时候,它可以先去做别的事情提高自己,等待美羊羊被喜羊羊伤透了心时,回过头来发现沸羊羊已经变的非常优秀,它自然就会接受沸羊羊了,这里沸羊羊被拒绝后不在围着美羊羊转,而是去做自己的事情,就是一个典型的挂起等待锁

自旋锁:一旦锁被释放,自旋锁可以第一时间拿到锁,速度会更快,但缺点是这个锁会一直消耗cpu空转等待(忙等)。通常是纯用户态操作,不需要经过内核态

挂起等待锁:如果锁被释放,不能第一时间拿到锁。通过内核的机制来挂起等待,时间更长。

评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不卷啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值