83 【面试官:说一下ReentrantLock 实现原理? - 后端研发工程师哈哈 | 小红书 - 你的生活指南】 😆 7iPHYXkH7ZY8itk 😆 http://xhslink.com/oVKyYR
ReentrantLock 是可重入的独占锁,只能有一个线程可以获取该锁,其它获取该锁的线程会被阻塞而被放入该锁的阻塞队列里面。
new ReentrantLock() 构造函数默认创建的是非公平锁 NonfairSync。
- 如果锁当前没有被其他线程占用,并且当前线程之前没有获取过该锁,则当前线程会获取到该锁,然后设置当前锁的拥有者为当前线程,并设置 AQS 的状态值为 1,然后直接返回。如果当前线程之前已经获取过该锁,则这次只是简单地把 AQS 的状态值加 1 后返回。
- 如果该锁已经被其他线程持有,非公平锁会尝试去获取锁,获取失败的话,则调用该方法线程会被放入 AQS 队列阻塞挂起。
公平锁 FaiSync
- 公平锁是指多个线程按照申请锁的顺序来获取锁,线程直接进入队列中排队,队列中的第一个线程才能获得锁
- 公平锁的优点是等待的线程不会饿死。缺点是整体吞吐效率相对非公平锁要低,等待队列中除第一个线程以外的所有线程都会阻塞,CPU 唤醒阻塞线程的开销比公平锁大