重入锁(ReentrantLock)是Java中的一种显式锁实现,它允许线程重复获取同一个锁。这意味着一个线程可以多次获得同一个锁而不被阻塞,使得线程能够以递归的方式进入由同一个锁保护的代码块。

synchronized关键字相比,ReentrantLock提供了更多的灵活性和功能。下面是ReentrantLock与synchronized关键字的主要区别:

  1. 可中断性:ReentrantLock提供了lockInterruptibly方法,允许线程在等待锁的过程中可以响应中断,而synchronized关键字不支持这样的操作。

  2. 公平性选择:ReentrantLock可以作为公平锁使用,即等待时间最长的线程将获得锁,而synchronized则无法指定是否为公平锁。

  3. 条件变量支持:ReentrantLock可以配合Condition对象实现精确地线程等待/通知机制,而synchronized无法直接支持这种功能。

  4. 尝试获取锁:ReentrantLock提供了tryLock方法,能够尝试获取锁而不被阻塞,而synchronized无法实现这种非阻塞式的锁获取。

  5. 锁的释放:使用synchronized时,锁的释放由JVM隐式管理;而ReentrantLock需要显式调用unlock方法来释放锁,这样就能够更灵活地控制锁的释放时机。

举例说明:
import java.util.concurrent.locks.ReentrantLock;public class ReentrantLockExample {    private final ReentrantLock lock = new ReentrantLock();    public void performTask() {        lock.lock(); // 获取锁        try {            // 受保护的临界区域            // ...            performSubTask(); // 在同一个线程中再次获取锁,不会被阻塞            // ...        } finally {            lock.unlock(); // 释放锁        }    }    public void performSubTask() {        lock.lock(); // 再次获取同一个锁,不会被阻塞        try {            // 受保护的临界区域            // ...        } finally {            lock.unlock(); // 释放锁        }    }}

在上面的示例中,performTask方法和performSubTask方法都在同一个线程内多次获取了同一个ReentrantLock,而不会造成死锁或阻塞。这展示了重入锁的特性。

本篇文章来源于微信公众号: 互联网面试小帮手



微信扫描下方的二维码阅读本文

此作者没有提供个人介绍
最后更新于 2024-04-16