锁策略

1.乐观锁VS悲观锁
乐观锁:预测锁竞争不是很激烈(这里做的工作相对更少)
悲观锁:预测锁竞争很激烈(这里做的工作相对更多)
悲观和乐观唯一的区分:主要是看预测锁竞争激烈程度的结论
2.轻量级锁VS重量级锁
重量级锁:加锁机制重度依赖了OS提供mutex(互斥锁)
                大量的用户态和内核态切换  很容易引发线程的调度
轻量级锁:加锁机制尽可能不使用mutex,而是尽量在用户态用代码完成,实在搞不定了.再使用mutex
                 少量的内核态和用户态切换  不太容易引发线程调度
轻量级锁加锁解锁开销比较小,效率更高.
重量级锁加锁解锁开销比较大,效率更低.
3.自旋锁VS挂起等待锁
自旋锁:是一种典型的轻量级锁
挂起等待锁:是一种典型的重量级锁
自旋锁:获取锁失败,立即再次尝试获取锁,无线循环,一旦锁被释放,能第一时间感知到,从而获取到锁.   第一次获取锁失败,第二次尝试获取锁将在极短的时间内到来.
相较于挂起等待锁:
优点:没有释放CPU资源,一旦锁被释放,第一时间就能获取到,更高效,在锁持有时间比较短的场景中非常有用.
缺点:如果锁的持有时间较长,就会浪费CPU资源.
挂起等待锁:没有申请到锁的时候,线程被挂起,加入到阻塞队列中等待,当锁被释放后,有机会获取到锁.
4.互斥锁VS读写锁
互斥锁:就是synchronized这样的锁,提供了加锁解锁两个操作,如果一个线程加锁了,另一个线程也尝试加锁,就会阻塞等待
读写锁:提供了针对读加锁  针对写加锁  解锁  三种操作.
            读加锁和读加锁之间,不互斥
            读加锁和写加锁之间,互斥
            写加锁和写加锁之间,互斥
注:只要涉及到"互斥",就会产生线程的挂起等待.一旦挂起等待,再次唤醒就不知道隔了多久了.
     因此,尽可能减少"互斥"的机会,就是提高效率的重要途径.
读写锁适用于"频繁读 不频繁写"的场景中.
5.公平锁VS非公平锁
假设有三个线程A B C. A先尝试获取锁,获取成功.B尝试获取锁,获取失败,阻塞等待.C最后尝试获取锁,获取失败,阻塞等待,
当线程A释放锁以后,会发生什么呢?
公平锁:遵循"先来后到".B比C先尝试加锁,当A释放锁之后,B就能比C先获取到锁
非公平锁:不遵循"先来后到".B和C都可能获取到锁.
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值