可重入锁(Reentrant Lock)是一种支持重入的锁,即同一线程可以多次获取该锁而不会发生死锁。

在 Java 中,可以使用 synchronized 关键字和 Lock 接口的 ReentrantLock 类来实现可重入锁。

使用 synchronized 关键字实现可重入锁

synchronized 关键字是 Java 中内置的一种锁机制,它可以用来修饰方法或代码块,保证在同一时间只有一个线程可以进入被修饰的方法或代码块。

当一个线程已经获取了某个对象的锁之后,再次尝试获取该对象的锁时,就可以直接获取,而不会被阻塞。这种机制就是可重入锁的实现。

public class ReentrantLockExample {
    public synchronized void outer() {
        inner();
    }
    
    public synchronized void inner() {
        // do something
    }
}

在上述代码中,outer() 方法和 inner() 方法都使用了 synchronized 关键字修饰,表示它们是同步方法。当一个线程调用 outer() 方法时,会获取到对象的锁,然后再调用 inner() 方法时,由于已经持有该对象的锁,可以直接进入 inner() 方法而不会被阻塞。

使用 ReentrantLock 类实现可重入锁

ReentrantLock 类提供了与 synchronized 关键字类似的功能,但更加灵活和可控。

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockExample {
    private Lock lock = new ReentrantLock();
    
    public void outer() {
        lock.lock();
        try {
            inner();
        } finally {
            lock.unlock();
        }
    }
    
    public void inner() {
        lock.lock();
        try {
            // do something
        } finally {
            lock.unlock();
        }
    }
}

在上述代码中,使用 ReentrantLock 类来创建一个可重入锁对象,并使用 lock() 方法获取锁,使用 unlock() 方法释放锁。在调用 inner() 方法时,同样需要先获取锁,然后再释放锁。

总结

无论是使用 synchronized 关键字还是 ReentrantLock 类,它们都可以实现可重入锁的功能,保证同一线程可以多次获取锁而不会发生死锁。具体使用哪种方式,可以根据实际需求和场景来选择。

  • synchronized 更简洁易用,适合简单的同步需求。
  • ReentrantLock 提供更灵活的控制,例如可以设置公平锁和非公平锁,以及使用条件变量等。
Java 可重入锁实现:synchronized 和 ReentrantLock 详解

原文地址: https://www.cveoy.top/t/topic/qokx 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录