ReentrantLock是如何实现可重入性的

举报
赵KK日常技术记录 发表于 2023/06/30 23:00:47 2023/06/30
【摘要】 ReentrantLock是如何实现可重入性的可重入锁(Reentrant Lock)允许同一线程多次获取同一把锁。也就是说,正在持有锁的线程可以再次获取该锁,而不会被自己 BLOCK。这对于解决方法嵌套问题非常有帮助。ReentrantLock实现可重入性主要通过计数器来实现:ReentrantLock使用一个整型计数器来记录锁的持有者及持有次数。当一个线程第一次获取锁时,计数器值设为1...

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通过使用内部计数器来记录锁被获取的次数,实现了重入锁功能。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。