公平锁与非公平锁详解
公平锁与非公平锁详解
Java锁的两员大将
- synchronized
- ReentrantLock
核心思想:
假设在银行内,有一个服务窗口,有很多线程想去办理业务
- 非公平锁
新来的线程不关心是否有人排队,他会直接冲向窗口。如果此时窗口正好空着,他就能直接办理。
这就是synchronized和ReentrantLock的默认模式。
他的好处是效率高,减少线程切换的开销。但可能导致先来的线程一直不能运行。(饥饿) - 公平锁
银行设立了一个叫号机。每个新来的线程都必须取号排队。
这就是 ReentrantLock(true)。
他保证了绝对的先来后到,公平性最好,但是增加了线程调度的开销,所以性能可能比较低。
synchronized和ReentrantLock的区别
- synchronized:线程进入方法就自动上锁,退出自动解锁,无法干预,实现简单,不容易出错,单一(内置锁)
- ReentrantLock:可以手动上锁,手动解锁,可以设置公平锁,可以设置可重入锁,可以设置锁超时,可以设置锁中断,实现复杂,易出错,可扩展(API锁)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 花海!
