java锁是如何实现的
Java锁的实现原理
Java中的锁机制主要通过synchronized关键字和java.util.concurrent.locks包下的类实现。以下是核心实现方式:
synchronized关键字
synchronized基于JVM内置锁(Monitor)实现,分为同步代码块和同步方法两种形式。
-
同步代码块:通过
monitorenter和monitorexit字节码指令实现,锁对象存储在对象头的Mark Word中。
synchronized(obj) { // 临界区代码 } -
同步方法:方法标志位
ACC_SYNCHRONIZED表示该方法需要获取锁。public synchronized void method() {}
ReentrantLock
ReentrantLock是JDK提供的显式锁,基于AQS(AbstractQueuedSynchronizer)实现:

-
AQS核心:通过CLH队列管理线程竞争,使用
state变量表示锁状态。ReentrantLock lock = new ReentrantLock(); lock.lock(); try { // 临界区代码 } finally { lock.unlock(); } -
公平性:构造函数参数
fair决定是否公平锁(默认非公平)。
锁优化技术
JVM对锁进行了多种优化:
- 偏向锁:适用于单线程重复获取锁的场景,通过Mark Word记录偏向线程ID。
- 轻量级锁:通过CAS操作竞争锁,避免线程阻塞。
- 自旋锁:竞争失败时短暂自旋而非直接挂起线程。
- 锁消除:JIT编译器对不可能存在竞争的锁进行消除。
- 锁粗化:合并相邻同步块减少锁操作开销。
其他锁实现
- ReadWriteLock:读写分离锁,允许多读单写。
- StampedLock:乐观读锁,通过版本号控制并发。
- Condition:条件变量,与
Lock配合实现线程间协调。
锁的选择需根据具体场景权衡性能、公平性和功能需求。






