登录
首页 >  文章 >  java教程

Java显式锁ReentrantLock详解

时间:2025-10-23 13:47:27 340浏览 收藏

推广推荐
免费电影APP ➜
支持 PC / 移动端,安全直达

本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《Java显式锁实现:ReentrantLock使用详解》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~

ReentrantLock提供比synchronized更灵活的线程控制,支持公平锁、可中断等待和超时获取锁;通过lock()加锁,必须在finally中unlock()释放锁以避免死锁;tryLock()实现非阻塞或限时获取锁,提升并发性能;lockInterruptibly()允许等待线程响应中断,适用于可取消操作场景。

如何在Java中使用ReentrantLock实现显式锁

在Java中,ReentrantLock 是一种可重入的显式锁,提供了比synchronized更灵活的线程控制机制。它位于 java.util.concurrent.locks 包中,支持公平锁与非公平锁、可中断等待、超时获取锁等高级功能。

1. 基本使用:lock() 与 unlock()

使用 Reentrant7Lock 的核心是手动加锁和释放锁。必须确保在 finally 块中释放锁,防止死锁。

示例代码:

import java.util.concurrent.locks.ReentrantLock;

public class Counter {
    private int count = 0;
    private final ReentrantLock lock = new ReentrantLock();

    public void increment() {
        lock.lock(); // 获取锁
        try {
            count++;
        } finally {
            lock.unlock(); // 保证锁一定被释放
        }
    }

    public int getCount() {
        lock.lock();
        try {
            return count;
        } finally {
            lock.unlock();
        }
    }
}

2. 避免死锁:使用 try-finally 结构

显式锁不会像 synchronized 那样自动释放。如果临界区发生异常且未释放锁,其他线程将永久阻塞。

正确的做法是在 try 块前加锁,finally 中解锁,确保即使抛出异常也能释放锁。

3. 尝试获取锁:tryLock()

ReentrantLock 支持非阻塞获取锁,适用于避免死锁或限时等待的场景。

常用方法:

  • tryLock():立即返回是否获取成功
  • tryLock(long timeout, TimeUnit unit):在指定时间内尝试获取锁

示例:

if (lock.tryLock()) {
    try {
        // 执行操作
    } finally {
        lock.unlock();
    }
} else {
    // 锁被占用,执行备用逻辑
}

4. 可中断锁:lockInterruptibly()

当线程在等待进入临界区时,可以响应中断,避免无限等待。

适用于需要取消任务的场景。

public void interruptibleMethod() throws InterruptedException {
    lock.lockInterruptibly(); // 可中断地获取锁
    try {
        // 临界区操作
    } finally {
        lock.unlock();
    }
}

基本上就这些。ReentrantLock 提供了对锁行为的精细控制,但也要承担手动管理的责任。只要记得始终在 finally 中 unlock,合理使用 tryLock 和中断机制,就能写出高效安全的并发代码。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《Java显式锁ReentrantLock详解》文章吧,也可关注golang学习网公众号了解相关技术文章。

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>