Java并发编程:ReentrantLock详解

interpret1905 6 0 pdf 2024-07-04 08:07:57

ReentrantLock 是 Java 并发包(java.util.concurrent.locks)中的一个可重入锁,允许同一个线程多次获取同一把锁。

可重入性

可重入锁允许线程反复进入已获得锁保护的代码段,避免递归调用中的死锁问题。

ReentrantLock与AQS

ReentrantLock 基于 AQS(AbstractQueuedSynchronizer)实现,AQS 维护一个状态字段和一个 FIFO 等待队列来管理线程同步。ReentrantLock 的内部类 Sync 继承自 AQS,并分为 FairSync(公平锁)和 NonfairSync(非公平锁)两个子类。

  • 公平锁: 按照线程请求锁的顺序获取锁。
  • 非公平锁: 不保证获取锁的顺序,可能存在线程插队。

公平锁与非公平锁实现

  • 公平锁: FairSync 在获取锁时会检查队列中是否有其他线程在等待,如果有,即使锁可用,线程也会等待,直到队列为空或成为队列的第一个元素。
  • 非公平锁: NonfairSync 获取锁时不会检查队列状态,直接尝试获取,可能导致线程插队,提高吞吐量但牺牲公平性。

ReentrantLock默认实现

ReentrantLock 默认是非公平锁,可通过构造函数传入 true 创建公平锁。

ReentrantLock与synchronized对比

| 特性 | ReentrantLock | synchronized |

| ----------- | ----------- | ----------- |

| 控制粒度 | 显式 | 隐式 |

Java并发编程:ReentrantLock详解

用户评论
请输入评论内容
评分:
暂无评论