Lock接口规范定义锁的基本操作,根据不同实现逻辑实现"公平机制的锁"、"非公平机制的锁"、"可重入的锁"。
public interface Lock { void lock(); void lockInterruptibly() throws InterruptedException; boolean tryLock(); boolean tryLock(long time, TimeUnit unit) throws InterruptedException; void unlock(); // 精细控制锁力度,类似Object的notify、notifyAll、wait等锁操作 Condition newCondition(); }
Lock家族图谱如下,基本串联所有j.u.c.locks包下类之间关系。 Lock接口定义规范 和 AbstractQueuedSynchronizer(AQS)提供实现基础,成为了核心汇集点。
核心类:
- AbstractOwnableSynchronizer : 记录当前保持独占同步的线程的简单类。
-
public abstract class AbstractOwnableSynchronizer implements java.io.Serializable { /** Use serial ID even though all fields transient. */ private static final long serialVersionUID = 3737899427754241961L; /** * Empty constructor for use by subclasses. */ protected AbstractOwnableSynchronizer() { } /** * 持有锁的线程 */ private transient Thread exclusiveOwnerThread; /** * 设置锁持有者 */ protected final void setExclusiveOwnerThread(Thread thread) { exclusiveOwnerThread = thread; } /** * 获取锁持有者 */ protected final Thread getExclusiveOwnerThread() { return exclusiveOwnerThread; } }
- AbstractQueuedLongSynchronizer / AbstractQueuedSynchronizer :AQS核心逻辑利用虚拟双向队列 CLH (Craig, Landin, and Hagersten)实现获锁、释放锁、排队系列操作,是并发包最核心逻辑。
- ReentrantLock / ReentrantReadWriteLock :独占锁 和 读写锁,实现更高效锁机制。
- Condition:细粒度控制锁,每个Condition条件将会建立一个虚拟队列 与 CLH关联,进而达到控制锁。
- LockSupport:线程唤醒、休眠辅助类。