Java公平与非公平锁分析

一、公平锁:

  • 锁被释放后,只能队首线程获得锁,新来线程必须排到队尾。
  • 能较好的保证每个线程都获得执行机会,不会出现线程饥饿。
  • 吞吐量较低。

二、非公平锁:

  • 锁被释放后,排队线程和新来线程一同争抢锁。
  • 不能保证每个线程都能获得执行机会,可能导致线程饥饿。
  • 吞吐量高出10倍。

三、非公平锁吞吐量高的原因分析:

  1. 非公平模式下:锁被释放时若新来了线程,这个新线程不用阻塞排队,立马参与争抢,所以省去了新线程阻塞引起的上下文切换,减少了时间片和性能浪费。
  2. 公平模式下:从锁被释放到唤醒队首线程,再到队首线程转为可执行状态,再到真正获得执行机会,中间有一个不可忽视的时间间隔,这个间隔内CPU空闲了,所以吞吐量就下降了。

四、实践建议

  1. 在大多数场景中非公平锁,能宏观地保证公平性,极少出现明显的饥饿。所以通常建议使用非公平模式,以获得更高的吞吐量。
  2. 面对耗时较长或对公平性有较高要求的任务,则建议使用公平锁。
posted @ 2021-03-12 16:26  JaxYoun  阅读(312)  评论(0编辑  收藏  举报