学校网站建设计划,wordpress后台经常504,h5做的网站,wordpress文章调用代码ReentrantLock 的实现原理主要涉及到两个关键概念#xff1a;同步器#xff08;Sync#xff09;和 AQS#xff08;AbstractQueuedSynchronizer#xff0c;抽象队列同步器#xff09;。
ReentrantLock 使用 AQS 来实现可重入锁的机制。AQS 是 Java 并发包中的一个抽象基类…ReentrantLock 的实现原理主要涉及到两个关键概念同步器Sync和 AQSAbstractQueuedSynchronizer抽象队列同步器。
ReentrantLock 使用 AQS 来实现可重入锁的机制。AQS 是 Java 并发包中的一个抽象基类为实现锁和其他同步器提供了一种统一的框架。ReentrantLock 则是基于 AQS 提供的框架实现的。
以下是 ReentrantLock 的主要实现原理
1. AQS 的状态
AQS 内部维护一个状态变量用来表示被保护资源的状态。对于 ReentrantLock 来说状态值表示当前锁被持有的次数。当状态为0时表示锁未被持有大于0时表示锁已被某个线程持有。
2. 同步器Sync的实现
ReentrantLock 的内部实现继承了 AQS并提供了两个具体的实现类NonfairSync 和 FairSync分别对应非公平锁和公平锁。
NonfairSync在尝试获取锁时不考虑其他线程是否在等待队列中等待锁直接尝试获取。FairSync在尝试获取锁时会优先考虑等待时间最长的线程以实现公平性。
3. AQS 的队列
AQS 使用一个双向链表作为等待队列将请求锁但未能成功获取的线程加入队列。队列中的节点代表等待线程。
4. 获取锁的流程
当一个线程尝试获取锁时如果锁的状态为0则表示锁未被持有线程可以直接获取锁并将状态设置为1。如果锁的状态不为0表示锁已经被其他线程持有此时线程将被加入等待队列并被挂起直到锁被释放。当持有锁的线程再次尝试获取锁时AQS 会判断当前线程是否已经持有锁。如果是直接增加状态值如果不是则将该线程加入等待队列。
5. 释放锁的流程
当一个线程释放锁时AQS 会将状态值减1。如果状态值为0表示锁已经完全释放此时会唤醒等待队列中的下一个线程。如果状态值不为0表示锁仍然被持有此时直接减少状态值。
6. 实现可重入性
ReentrantLock 的实现允许同一个线程多次获取锁这是通过在节点中维护一个记录线程持有次数的变量来实现的。线程持有锁时增加该变量释放锁时减少该变量。只有当该变量减到0时才表示锁完全被释放。
ReentrantLock 通过 AQS 提供的队列和状态管理机制实现了可重入锁的机制保证了锁的正确性和灵活性。不同的实现类NonfairSync和FairSync在获取锁的策略上有所区别分别支持非公平锁和公平锁。