Java可重入锁

本文介绍了JavaReentrantLock的可重入性、公平锁/非公平锁的区别、Condition的使用、锁中断响应以及定时锁功能,强调了在需要灵活锁控制和多线程协作场景中的优势。
摘要由CSDN通过智能技术生成

可重入锁(Reentrant Lock)是一种支持线程重复获取同一把锁的锁机制。当一个线程获得了某个对象的锁,再次请求此对象锁时仍然会得到该锁。Java 中的 synchronized 关键字隐式地提供了可重入锁的机制,而 ReentrantLock 显式提供了这一特性。

以下是可重入锁的一些特点和使用场景:

  1. 重入性: 当一个线程持有一个锁的时候,还可以再次获取该锁而不发生死锁。这是通过记录锁的持有者和计数器的方式实现的。

  2. 公平锁和非公平锁: ReentrantLock 提供了公平锁和非公平锁两种模式。在公平锁模式下,线程按照它们发出请求的顺序获取锁。在非公平锁模式下,线程可能会在请求的瞬间获取锁。

    ReentrantLock fairLock = new ReentrantLock(true); // 公平锁
    ReentrantLock nonFairLock = new ReentrantLock(false); // 非公平锁

  3. 条件变量: ReentrantLock 支持 Condition 对象,通过 newCondition() 方法创建,可以用于实现更灵活的线程通信。

    ReentrantLock lock = new ReentrantLock();
    Condition condition = lock.newCondition();

  4. 锁的中断响应: ReentrantLock 提供了对中断的响应,线程可以在等待锁的过程中被中断。

    ReentrantLock lock = new ReentrantLock();
    try {
        lock.lockInterruptibly(); // 响应中断
        // 代码块
    } catch (InterruptedException e) {
        // 处理中断
    } finally {
        lock.unlock();
    }

  5. 可定时锁: ReentrantLock 提供了 tryLock(long timeout, TimeUnit unit) 方法,可以在指定的时间内尝试获取锁。

    ReentrantLock lock = new ReentrantLock();
    if (lock.tryLock(10, TimeUnit.SECONDS)) {
        try {
            // 代码块
        } finally {
            lock.unlock();
        }
    } else {
        // 获取锁失败,做相应处理
    }

  6. 可中断的获取锁: ReentrantLock 提供了 lockInterruptibly() 方法,可以在等待锁的过程中响应中断。

    ReentrantLock lock = new ReentrantLock();
    try {
        lock.lockInterruptibly();
        // 代码块
    } catch (InterruptedException e) {
        // 处理中断
    } finally {
        lock.unlock();
    }

可重入锁通常用于需要更灵活的锁控制、实现公平锁、需要支持中断的场景,以及需要更细粒度的锁定的情况。在需要这些特性的情况下,使用 ReentrantLock 是一种较为灵活和强大的选择。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值