Java多线程进阶——常见的锁策略

在这里插入图片描述

请添加图片描述

前言

??博客主页: ??【如风暖阳】??
??精品Java专栏【JavaSE】【备战蓝桥】、【JavaEE初阶】【MySQL】【数据结构】
??欢迎点赞 ?? 收藏 留言评论 ??私信必回哟??

??本文由 【如风暖阳】 原创,首发于 CSDN??

??博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言

??博客中涉及源码及博主日常练习代码均已上传码云(gitee)GitHub


请添加图片描述

??内容导读??

请添加图片描述

??1.乐观锁VS悲观锁

这是两种不同的加锁态度:

乐观锁:预测锁冲突的概率不高,所以做的工作比较少一点(简单一点),但效率更高。

悲观锁:预测锁冲突的概率较高,所以做的工作比较多一点(复杂一点),效率更低。

就像我们在与人合租一间房时,A在上厕所时,就比较乐观,觉得这个时候B不会去上厕所,于是就没有锁门(乐观锁)。
而B在上厕所时,就比较悲观,觉得这个时候A来上厕所的概率比较大,于是就上锁了(悲观锁)。

??2.读写锁VS普通互斥锁

普通互斥锁:就如同synchronized,当两个线程竞争同一把锁时,就会产生竞争

读写锁:具有加读锁和加写锁两个操作。
读锁和读锁之间,不会产生竞争;写锁和写锁之间会产生竞争;读锁和写锁之间也有竞争。
在实际场景中,读的操作要比写的操作多很多,读写锁要比普通的互斥锁少了很多的锁竞争,优化了效率。

??3.重量级锁VS轻量级锁

重量级锁:加锁解锁开销比较大(涉及到进入内核态的加锁逻辑,开销比较大)

轻量级锁:加锁解锁开销比较小(纯用户态的加锁逻辑,开销比较小)

乐观锁/悲观锁是站在加锁/解锁的过程中干的工作的多少看待的。
而重量级锁/轻量级锁是站在加锁/解锁消耗的时间多少看待的。

在通常情况下,干的工作多,消耗的时间也多,因此,一般乐观锁也比较轻量。悲观锁,一般比较重量。

??4.自旋锁VS挂起等待锁

自旋锁:在获取锁失败以后,不会立刻释放CPU,而是不断的询问锁的持有状态,一旦锁被释放,就能立刻获取到锁,是轻量级锁的一种典型表现。(自旋就类似于在定时器一篇文章中出现的忙等,消耗了大量CPU,反复询问当前锁是否就绪)

挂起等待锁:在获取锁失败以后,对应的线程就会在内核中挂起等待(放弃CPU,进入等待队列),在锁被释放后由操作系统唤醒,是重量级锁的一种典型实现。

??5.公平锁VS非公平锁

公平锁:遵循先来后到的规则,在多个线程等待同一把锁时,谁先来尝试拿锁,那这把锁就是谁的。

非公平锁:遵循随机的规则,在多个线程等待同一把锁时,锁如果释放,每个线程获取到锁的概率是相同的。

??6.可重入锁VS不可重入锁

一个线程连续加锁两次,不会造成死锁,就是可重入锁
反之,如果造成死锁,就是不可重入锁

??7.synchronized特性

对于synchronized

1.既是乐观锁,也是悲观锁
2.既是轻量级锁,也是重量级锁
3.乐观锁的部分是基于自旋锁实现的,悲观锁的部分是基于挂起等待锁实现的

(synchronized是自适应锁,在初始使用的时候,是乐观锁/轻量级锁/自旋锁,如果锁竞争变的激烈了,synchronized会自动升级成悲观锁/重量级锁/挂起等待锁)

4.不是读写锁,是普通互斥锁
5.是非公平锁
6.是可重入锁


最后的话
总结不易,希望uu们不要吝啬你们的??哟(^U^)ノ~YO!!如有问题,欢迎评论区批评指正??

请添加图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值