一、公平锁:
- 锁被释放后,只能队首线程获得锁,新来线程必须排到队尾。
- 能较好的保证每个线程都获得执行机会,不会出现线程饥饿。
- 吞吐量较低。
二、非公平锁:
- 锁被释放后,排队线程和新来线程一同争抢锁。
- 不能保证每个线程都能获得执行机会,可能导致线程饥饿。
- 吞吐量高出10倍。
三、非公平锁吞吐量高的原因分析:
- 非公平模式下:锁被释放时若新来了线程,这个新线程不用阻塞排队,立马参与争抢,所以省去了新线程阻塞引起的上下文切换,减少了时间片和性能浪费。
- 公平模式下:从锁被释放到唤醒队首线程,再到队首线程转为可执行状态,再到真正获得执行机会,中间有一个不可忽视的时间间隔,这个间隔内CPU空闲了,所以吞吐量就下降了。
四、实践建议
- 在大多数场景中非公平锁,能宏观地保证公平性,极少出现明显的饥饿。所以通常建议使用非公平模式,以获得更高的吞吐量。
- 面对耗时较长或对公平性有较高要求的任务,则建议使用公平锁。