什么是可重入锁?

可重入锁(Reentrant Lock),又称递归锁,是一种允许同一线程在已经持有锁的情况下再次获取锁的锁。这意味着一个线程可以多次获得同一个锁而不会导致死锁。这在某些场景下非常有用,比如当一个方法调用另一个方法,而这两个方法都需要获取同一个锁时。

可重入锁的工作原理

可重入锁内部维护一个计数器,记录当前持有锁的线程及其获取锁的次数。只有当计数器为0时,其他线程才能获得该锁。

Java 示例代码

以下是一个使用 ReentrantLock 的示例:


java

复制代码

import java.util.concurrent.locks.ReentrantLock; public class ReentrantLockExample { private final ReentrantLock lock = new ReentrantLock(); public void methodA() { lock.lock(); // 获取锁 try { System.out.println("In methodA"); methodB(); // 调用另一个需要锁的方法 } finally { lock.unlock(); // 释放锁 } } public void methodB() { lock.lock(); // 再次获取锁 try { System.out.println("In methodB"); } finally { lock.unlock(); // 释放锁 } } public static void main(String[] args) { ReentrantLockExample example = new ReentrantLockExample(); example.methodA(); // 从methodA开始调用 } }

代码解析

  1. 锁的创建:使用 ReentrantLock 创建一个锁对象。

  2. 获取锁

    • methodA() 中,调用 lock.lock() 获取锁。
    • methodB() 中,同样调用 lock.lock() 获取锁。
  3. 递归调用

    • methodA() 中调用 methodB() 时,由于 methodA() 已经持有锁,methodB() 可以安全地再次获取锁,不会造成死锁。
  4. 释放锁

    • finally 块中调用 lock.unlock() 确保无论方法如何退出,锁都能被正确释放。

注意事项

  • 必须匹配调用:每次调用 lock.lock() 必须对应一个 lock.unlock(),否则会导致锁不被释放,进而可能导致其他线程阻塞。
  • 性能:虽然可重入锁提供了更大的灵活性,但其实现可能会引入一些性能开销,尤其是在高度竞争的场景中。

可重入锁在并发编程中非常常见,可以有效地避免死锁,同时允许更复杂的锁定策略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值