ReentrantLock是如何实现可重入性的
ReentrantLock是如何实现可重入性的
可重入锁(Reentrant Lock)允许同一线程多次获取同一把锁。也就是说,正在持有锁的线程可以再次获取该锁,而不会被自己 BLOCK。
这对于解决方法嵌套问题非常有帮助。
ReentrantLock实现可重入性主要通过计数器来实现:
- ReentrantLock使用一个整型计数器来记录锁的持有者及持有次数。
- 当一个线程第一次获取锁时,计数器值设为1。
- 同一个线程再次获取锁时,计数器会+1;释放锁时计数器会-1。
- 只有当计数器的值变为0时,锁才会真正释放。
具体实现如下:
java
private int count;
public synchronized void lock() {
count++;
// … 其他获取锁操作
}
public synchronized void unlock() {
if (count == 0) throw new IllegalMonitorStateException();
count–;
// … 其他释放锁操作
}
举个例子:
java
public void method1() {
lock.lock();
try {
method2();
} finally {
lock.unlock();
}
}
public void method2() {
lock.lock();
try {
// some code…
} finally {
lock.unlock();
}
}
method1 firstly gets lock, then invokes method2.
method2 also gets lock, but because it’s still the same thread, the lock count increases to 2 instead of blocking and waiting.
After method2 returns, unlock is called twice so the lock count becomes 0 and the lock is actually released.
利用这样的机制,ReentrantLock就实现了可重入性。同一个线程可以重复获取同一把锁多次。
内部计数器的作用是:
- 记录锁当前的状态(已经获取几把锁)
- 确保 unlock() 方法被调用与 lock() 方法一样的次数,才能完全释放锁。
这也正是 ReentrantLock 名字的由来 —— 可 重 入 的 锁。
总的来说,ReentrantLock通过使用内部计数器来记录锁被获取的次数,实现了重入锁功能。
- 点赞
- 收藏
- 关注作者
评论(0)