根据线程获取锁的抢占机制,锁可分为公平锁和非公平锁。

  1. 公平锁:线程获取锁的顺序是按照线程请求锁的时间顺序决定的,也就是最早请求的线程将最早获取到锁,即 FIFO
    可用 JUC 中的lock提供了实现 ReentrantLock  lock=new ReentrantLock  (ture)
  2. 非公平锁:线程加锁时直接尝试获取锁,获取不到才排到队尾等待,不一定FIFO。代表:synchronize
     

ps:  ReentrantLock 同时支持两种锁,默认是非公平锁

公平的锁机制往往没有非公平的效率高。
但是,并不是任何场景都是以TPS作为唯一的指标,公平锁能够减少“饥饿”发生的概率,等待越久的请求越是能够得到优先满足。

非公平锁的实现原理

公平锁与非公平锁_公平锁

公平锁的实现原理

公平锁与非公平锁_公平锁_02