Skip to content

ReentrantLock类是Java中的一个锁实现,它提供了与synchronized关键字相似的功能。它允许线程通过获取和释放锁来控制对共享资源的访问。

与synchronized关键字不同,ReentrantLock类提供了更多的灵活性和功能。下面是一些ReentrantLock类的特点:

  • 可重入性:一个线程可以多次获取同一个锁而不会产生死锁。这使得线程在执行嵌套调用时能够正常工作。
  • 公平性:ReentrantLock类支持公平性设置,即按照线程请求锁的顺序分配锁。默认情况下,它是非公平的,但可以通过构造函数参数设置为公平锁。
  • 条件变量:ReentrantLock类提供了条件变量(Condition)的支持,允许线程在满足特定条件之前等待或继续执行。条件变量使用newCondition()方法创建,并且与锁相关联。
  • 中断响应:ReentrantLock类支持线程的中断响应。当一个线程在等待锁时被中断,它将抛出InterruptedException异常。

以下是一个简单示例代码,演示了如何使用ReentrantLock类:

import java.util.concurrent.locks.ReentrantLock;

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

    public static void main(String[] args) {
        Thread thread1 = new Thread(() -> {
            lock.lock();
            try {
                System.out.println("Thread 1 acquired the lock");
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
                System.out.println("Thread 1 released the lock");
            }
        });

        Thread thread2 = new Thread(() -> {
            lock.lock();
            try {
                System.out.println("Thread 2 acquired the lock");
            } finally {
                lock.unlock();
                System.out.println("Thread 2 released the lock");
            }
        });

        thread1.start();
        // 等待一段时间,确保线程1先获取到锁
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        thread2.start();
    }
}

在上面的示例中,我们创建了一个ReentrantLock实例,并使用lock()和unlock()方法来控制对共享资源的访问。线程1首先获取锁并持有它2秒钟,然后释放锁。接着,线程2尝试获取锁并执行相应的操作。

在使用ReentrantLock时,必须始终确保在适当的地方调用unlock()方法以释放锁,以避免死锁或其他问题。