前言
Java 的 Lock 机制是 Java 并发编程(JDK 1.5+)中用于控制多个线程访问共享资源的核心工具。它位于 java.util.concurrent.locks 包下,提供了比传统的 synchronized 关键字更灵活、更强大的锁定操作。
本文主要介绍以 ReentrantLock 和 ReentrantReadWriteLock 为代表的 Lock 机制,内容包括 Java Lock 类继承关系、Lock 使用代码示例及 Lock 原理。
类结构
Java 的 Lock 机制源头可以从 Lock 接口说起,这是 Lock 机制的抽象类,规定了锁的相关协议,定义了锁的获取和释放方法。相比于 synchronized(隐式获取/释放锁),Lock 需要显式地获取和释放锁。
Lock 接口核心方法:
public interface Lock {
// 1. 基本锁操作
void lock();
void unlock();
// 2. 可中断锁
void lockInterruptibly() throws InterruptedException;
// 3. 尝试获取锁
boolean tryLock();
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
// 4. 条件变量
Condition newCondition();
}
Java 同步机制里面涉及的接口层主要有下面三个核心接口:
- Lock 接口 - 所有锁的顶级接口,定义了 lock()、unlock() 等基本方法
- ReadWriteLock 接口 - 读写锁接口,定义了读锁和写锁的获取方法
- Condition 接口 - 条件变量接口,用于线程间的等待/通知机制
对上面几个接口类常用的主要有几个实现类:
- ReentrantLock:实现了 Lock 接口内部包含 Sync 同步器
- ReentrantReadWriteLock:实现了 ReadWriteLock 接口 内部包含 Sync、ReadLock、WriteLock 几个内部类
- ConditionObject:实现了 Condition 接口,是 AQS 的内部类
简化版继承结构类图 UML:

