19 ReentrantLock和synchronized在现代jvm差别有多大?
vvEcho
2026-01-27 17:49:16
Categories:
05 并发编程
Tags:
特点对比
synchronized(内置锁)是java内置关键字,用在synchronized修饰的代码块或者方法中,会自动获取对象锁,并释放对象锁。
它的特点如下:
- 简单易用,自动释放锁
- 不可中断等待(等待锁时无法被中断)
- 只能是非公平锁(JDK15开始可配置)
- 只有一个等待条件(Object.wait/notify)
- 无法获取锁状态信息
ReentrantLock(显式锁),是jdk1.5之后出现的,是一个可重入锁,它提供了比synchronized更细粒度的控制,并且提供了更多的功能。
它的特点如下:
- 可中断锁:lockInterruptibly()
- 尝试获取锁:tryLock()(带/不带超时)
- 公平锁选项:可选择公平或非公平
- 多个条件队列:可创建多个Condition
- 锁状态查询:isLocked(), hasQueuedThreads()等
使用场景对比
synchronized(内置锁)适用于简单的同步场景,适用于大多数常规业务场景,与wait/notify配合使用时
reentrantlock(显式锁)适用于更复杂的同步场景,如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| if (lock.tryLock(100, TimeUnit.MILLISECONDS)) { try { } finally { lock.unlock(); } }
lock.lockInterruptibly();
Condition notFull = lock.newCondition(); Condition notEmpty = lock.newCondition();
|
reentrantlock提供一些方法获取线程的信息,而synchronized没有
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| ReentrantLock lock = new ReentrantLock();
int queueLength = lock.getQueueLength();
boolean hasQueuedThreads = lock.hasQueuedThreads();
boolean threadIsQueued = lock.hasQueuedThread(Thread.currentThread());
boolean isLocked = lock.isLocked();
boolean isHeldByCurrentThread = lock.isHeldByCurrentThread();
int holdCount = lock.getHoldCount();
boolean isFair = lock.isFair();
|