多线程中的锁策略——面试八股文

1.乐观锁与悲观锁

乐观锁:
他预测锁冲突的概率不高,如果概率不高的话,我就可以把任务分成多个,在多次加锁解锁过程中完成(每一个加锁解锁时,任务很少 因为已经分成了很多),所以做的事情就会简单一些
悲观锁:
预测锁冲突的概率高,如果还是像乐观锁一样,把任务分成多个的话,因为锁冲突概率高,所以拿到锁不太容易,应该把任务在一次锁里就尽可能完成。所以悲观锁做的事情会复杂一点。

这两个锁是在加锁的过程上看待的,也就是加锁解锁过程中干的事情多还是少

2.轻量级锁与重量级锁

轻量级锁:
加锁解锁的开销小,只是一个纯用户态的加锁逻辑。
重量级锁:
加锁解锁的开销大,因为是一个用户态刀内核态的加锁逻辑

这两个锁是站在加锁的结果上看待的,最终加锁解锁的操作消耗的时间多与少。

3.自旋锁与挂起等待锁

自旋锁:
是轻量级锁的一种体现,它会什么也不做,一直访问当前锁是否已经就绪,消耗大量cpu,这样可以在解锁的时候第一时间确定锁的状态。
挂起等待锁:
是重量级锁的一种体现,它会在锁被占用的时候,去做别的任务,cpu可以去做别的事情,但是就不能第一时间获取到锁的信息了,等的时间可能会长一点,但是cpu做的事情更多了。

4.读写锁与普通互斥锁

普通互斥锁:
如synchronized
当两个线程竞争同一把锁的时候就会阻塞等待。
读写锁:
有两种情况 1.加读锁 给读数据这个操作加锁.2.加写锁,给修改(写)数据这个操作加锁
因为读锁和读锁之间不会有竞争,读锁和写锁,写锁和写锁之间会有竞争,使用读写锁,就会少很多锁竞争,提升效率。

公平锁与非公平锁

公平锁:
1 2 3线程竞争同一把锁,谁先来谁拿到锁。实现公平锁需要引入额外的数据结构。
非公平锁:
1 2 3线程竞争同一把锁,几个线程随机拿到锁,1先来的 但是3拿到了锁,这也是操作系统默认的锁的调度方式。

可重入锁与不可重入锁

可重入锁:
synchronized就是一种可重入锁,同一个线程针对同一把锁,连续加锁两次不会出现死锁
不可重入锁:
同一个线程针对同一把锁,连续加锁两次出现死锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

keild

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

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

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

打赏作者

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

抵扣说明:

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

余额充值