公平锁与非公平锁详解

Java锁的两员大将

  • synchronized
  • ReentrantLock

核心思想:

假设在银行内,有一个服务窗口,有很多线程想去办理业务

  • 非公平锁
    新来的线程不关心是否有人排队,他会直接冲向窗口。如果此时窗口正好空着,他就能直接办理。
    这就是synchronized和ReentrantLock的默认模式。
    他的好处是效率高,减少线程切换的开销。但可能导致先来的线程一直不能运行。(饥饿)
  • 公平锁
    银行设立了一个叫号机。每个新来的线程都必须取号排队。
    这就是 ReentrantLock(true)。
    他保证了绝对的先来后到,公平性最好,但是增加了线程调度的开销,所以性能可能比较低。

synchronized和ReentrantLock的区别

  • synchronized:线程进入方法就自动上锁,退出自动解锁,无法干预,实现简单,不容易出错,单一(内置锁)
  • ReentrantLock:可以手动上锁,手动解锁,可以设置公平锁,可以设置可重入锁,可以设置锁超时,可以设置锁中断,实现复杂,易出错,可扩展(API锁)