根据线程获取锁的抢占机制,锁可分为公平锁和非公平锁。
- 公平锁:线程获取锁的顺序是按照线程请求锁的时间顺序决定的,也就是最早请求的线程将最早获取到锁,即 FIFO
可用 JUC 中的lock提供了实现 ReentrantLock lock=new ReentrantLock (ture) -
非公平锁:线程加锁时直接尝试获取锁,获取不到才排到队尾等待,不一定FIFO。代表:synchronize
ps: ReentrantLock 同时支持两种锁,默认是非公平锁
公平的锁机制往往没有非公平的效率高。
但是,并不是任何场景都是以TPS作为唯一的指标,公平锁能够减少“饥饿”发生的概率,等待越久的请求越是能够得到优先满足。
非公平锁的实现原理
公平锁的实现原理