ReentrantLock
问题 ReentrantLock 是什么?为什么已经有 synchronized 了还需要它? ReentrantLock 和 synchronized 有什么区别? ReentrantLock 为什么叫“可重入锁”?可重入是怎么实现的? ReentrantLock 底层是怎么实现的? AQS 是什么 state 表示什么 exclusiveOwnerThread 表示什么 一个线程调用 lock() 以后,完整的加锁流程是什么? CAS 抢锁 抢锁失败以后怎么办 什么时候进入等待队列 什么时候阻塞线程 AQS 的等待队列是什么结构? CLH 队列 head tail Node 等待线程是怎么被阻塞和唤醒的? LockSupport.park() LockSupport.unpark() unlock() 的完整流程是什么? state 怎么减少 什么时候真正释放锁 怎么唤醒下一个线程 ReentrantLock 是怎么实现可重入的? 公平锁和非公平锁有什么区别? new ReentrantLock(true) 为什么默认是非公平锁 非公平锁为什么吞吐量通常更高 tryLock() 和 lock() 有什么区别? 立即失败 超时获取 适合什么场景 lockInterruptibly() 是什么?和 lock() 有什么区别? Condition 是什么?为什么有了 wait/notify 还需要 Condition? 一个 ReentrantLock 为什么可以创建多个 Condition? Condition.await() 和 signal() 的底层流程是什么? Condition Queue AQS Queue await 为什么会释放锁 signal 为什么不是直接让线程继续执行 ReentrantLock 使用时为什么必须在 finally 里 unlock()? ReentrantLock 会发生死锁吗?常见死锁场景有哪些? ReentrantLock 和 synchronized 在性能上谁更好? 实际业务中什么时候更适合用 synchronized,什么时候更适合用 ReentrantLock? 如果让你手写一个简化版互斥锁,你会怎么基于 AQS 实现? 为什么已经有 synchronized 了,还需要 ReentrantLock? ReentrantLock 本质上也是一种互斥锁,用来控制多个线程对共享资源的访问。 ...