重入锁(Reentrant Lock)是一种在多线程编程中用于控制对共享资源访问的锁机制。它的特点是允许同一个线程多次获得同一把锁,也就是说,线程可以进入由它已经持有的锁所保护的代码块,而不会被自己持有的锁所阻塞。这种特性被称为锁的"可重入性"或"递归性"。
重入锁的主要目标是解决多线程环境下的互斥访问问题,保证只有一个线程可以进入临界区(被锁保护的代码段),从而避免了竞态条件(Race Condition)和数据不一致的问题。
Java 中的 java.util.concurrent.locks.ReentrantLock
类就是一个典型的重入锁的实现,它提供了比传统的synchronized
关键字更多的灵活性和功能,例如可以设置超时时间、中断等待锁的线程、提供公平性策略等。
以下是一个使用重入锁的简单示例:
import java.util.concurrent.locks.ReentrantLock;public class ReentrantLockExample {private final ReentrantLock lock = new ReentrantLock();public void performTask() {lock.lock(); // 获取锁try {// 执行需要同步的代码块// 这里可以嵌套调用 performTask(),因为是可重入锁} finally {lock.unlock(); // 释放锁}}
}
需要注意的是,使用重入锁需要小心避免死锁(Deadlock)等问题,因为多次获得锁需要相应数量的解锁操作,如果不小心导致锁无法释放,就可能发生死锁。因此,在使用重入锁时,要确保在适当的时候释放锁,通常可以使用try-finally
块来保证锁的释放。
以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的。