开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第33天,点击查看活动详情
概念
公平锁是指多个线程按照申请锁的顺序来获取锁,采用先来后到哦,先来先服务的原则。老的线程排队使用锁,新线程仍然排队使用锁。
非公平锁多个线程按照上来就直接尝试占有锁,如果尝试失败就采用类似公平锁的方式。老的线程排队使用锁,但是无法保证新线程抢占已经在排队的线程的锁。
非公平锁的优点在于吞吐量比公平锁大。
并发包ReentrantLock的创建可以指定构造函数的boolean类型来得到公平锁或者非公平锁 默认是非公平锁
实例
我们经常使用到的锁是ReentrantLock我们可以查看它的源码,默认使用的是非公平锁。
也就是说ReentrantLock可自定义使用的是公平还是非公平锁,默认使用的是非公平锁。
对于synchronized而言 也是一种非公平锁。
总结
- 公平锁就是一种不能插队的队列,采用先来后到,先来先服务的原则。谁来了都只能老老实实的排队,一视同仁。
- 非公平锁就是一种允许插队的队列,每个线程想要获取锁就第一时间来尝试一下插队,如果插队成功了就直接获取到锁,插队失败了就只能老老实实的排队。
- 公平锁是生活中的一种理想状态,非公平锁可能更接近生活。由于非公平锁是存在一上来就能获得到锁的,所以它的吞吐量就要比公平锁大。