Skip to content

可重入锁(Reentrant Lock)是一种支持重复进入的锁机制。它允许同一个线程多次获取同一个锁,而不会导致死锁。

在Java中,可重入锁可以通过 ReentrantLock 类来实现。与传统的synchronized关键字相比,可重入锁提供了更灵活和强大的功能。

使用可重入锁时,线程可以多次获得同一个锁,每次获得锁后计数器会增加。只有当计数器归零时,其他线程才能获得该锁。这样可以确保同一个线程在释放锁之前可以多次进入临界区域。下面是一个使用可重入锁的示例:

import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockExample {
    private static ReentrantLock lock = new ReentrantLock();

    public static void main(String[] args) {
        // 线程1获取锁两次
        new Thread(() -> {
            lock.lock();
            try {
                System.out.println("Thread 1 acquired the lock");
                lock.lock();
                try {
                    System.out.println("Thread 1 re-acquired the lock");
                } finally {
                    lock.unlock(); // 释放锁
                }
            } finally {
                lock.unlock(); // 释放锁
            }
        }).start();

        // 线程2尝试获取锁
        new Thread(() -> {
            lock.lock();
            try {
                System.out.println("Thread 2 acquired the lock");
            } finally {
                lock.unlock(); // 释放锁
            }
        }).start();
    }
}

在这个示例中,线程1获取了锁两次,并成功释放。而线程2则在线程1完全释放锁之前无法获取到锁。

可重入锁的一个主要优点是它提供了公平性选择。你可以选择是否按照先来先服务的顺序分配锁。默认情况下,ReentrantLock 是非公平的,但你可以通过构造函数参数指定为公平锁。

总结一下,可重入锁允许同一个线程多次获得同一个锁,避免了死锁问题,并且提供了更灵活和强大的功能。