1. 引言
在Java并发编程中,ReentrantLock
作为一种可重入的互斥锁,提供了比synchronized
更强大和灵活的功能。其中,NonfairSync
作为ReentrantLock
内部非公平锁的实现,其设计理念和源码实现都体现了对性能和公平性的权衡。
2. NonfairSync概述
- 非公平锁特性:
- 新到达的线程在锁空闲时可能立即获取锁,而不必等待等待队列中的线程。
- 可能导致线程饥饿,但在某些场景下可以提高吞吐量。
- 继承结构:
NonfairSync
继承自Sync
,Sync
又继承自AQS(AbstractQueuedSynchronizer
)。Sync
作为内部抽象类,定义了锁的获取和释放的通用逻辑。
3. 源码分析
- 关键方法:
lock()
:尝试获取锁。首先通过CAS操作尝试直接获取锁,如果失败则调用acquire(1)进入AQS的队列等待逻辑。nonfairTryAcquire(int acquires)
:非公平锁获取锁的核心方法。如果当前锁未被占用(即state为0