个人网站建设概述,网站搭建软件,高端网站建设需要的人员配备,市场营销案例#x1f4d2; ReentrantLock 用法与源码剖析笔记 #x1f680; 一、ReentrantLock 核心特性
#x1f504; 可重入性#xff1a;同一线程可重复获取锁#xff08;最大递归次数为 Integer.MAX_VALUE#xff09;#x1f527; 公平性#xff1a;支持公平锁#xff08;按等… ReentrantLock 用法与源码剖析笔记 一、ReentrantLock 核心特性 可重入性同一线程可重复获取锁最大递归次数为 Integer.MAX_VALUE 公平性支持公平锁按等待顺序获取和非公平锁默认允许插队⏰ 超时机制tryLock(long timeout, TimeUnit unit) 可中断lockInterruptibly() 允许响应中断 条件变量Condition 实现精准线程唤醒对比 Object.wait/notify ️ 二、基础用法模板
ReentrantLock lock new ReentrantLock();
// 非公平锁默认 vs 公平锁new ReentrantLock(true)lock.lock(); // 阻塞获取锁
try {// 临界区代码
} finally {lock.unlock(); // ⚠️ 必须放在 finally 块
}// 高级用法示例
if (lock.tryLock(1, TimeUnit.SECONDS)) { // ⏳ 带超时尝试try {// ...} finally {lock.unlock();}
}三、源码架构分析 Sync 同步器继承 AQS NonfairSync非公平锁实现FairSync公平锁实现 AQS 核心机制 state 字段锁状态计数器0未锁定0锁定次数CLH 队列线程等待队列双向链表实现 ⚙️ 四、关键方法源码解析 1. lock() 方法对比
// 非公平锁实现
final void lock() {if (compareAndSetState(0, 1)) // 直接尝试插队setExclusiveOwnerThread(Thread.currentThread());elseacquire(1);
}// 公平锁实现
final void lock() {acquire(1); // ⚖️ 必须排队
}// AQS 核心方法
public final void acquire(int arg) {if (!tryAcquire(arg) acquireQueued(addWaiter(Node.EXCLUSIVE), arg))selfInterrupt();
}2. tryAcquire 差异
// 非公平锁 tryAcquire
protected final boolean tryAcquire(int acquires) {return nonfairTryAcquire(acquires); // 允许插队
}// 公平锁 tryAcquire
protected final boolean tryAcquire(int acquires) {if (getQueueLength() 0 getExclusiveOwnerThread() ! Thread.currentThread()) {return false; // 队列有等待线程时禁止获取}// ...后续与非公平锁相同
}五、设计亮点与注意事项 性能取舍非公平锁吞吐量更高减少线程切换但可能产生线程饥饿 锁释放必须unlock() 必须执行建议用 try-finally 包裹 Condition 高级用法实现多条件等待典型应用生产者-消费者模型⚠️ 避免死锁加锁顺序要一致超时机制可作为兜底 六、与 synchronized 对比
特性ReentrantLocksynchronized实现机制API 层面JVM 内置锁释放必须显式 unlock()自动释放公平性可配置非公平中断响应支持不支持条件变量多 Condition单 Object monitor性能高竞争时更优优化后差距缩小 七、最佳实践建议 优先选择需要高级功能时用 ReentrantLock简单场景用 synchronized 锁测试用 ThreadMXBean 检测死锁 锁粒度尽量缩小锁作用域 性能监控关注 getQueueLength() 等统计方法