可重入锁理解(redission)
在 Java 中,可重入锁(Reentrant Lock) 是一种允许同一线程多次获得同一锁的同步机制。这意味着,如果一个线程已经持有某个锁,它可以再次获取该锁而不会被阻塞。
🔄 什么是可重入锁?
可重入锁允许同一线程多次进入受锁保护的代码块,而不会导致死锁。这在方法调用中尤为重要,尤其是当一个同步方法调用另一个同步方法时。
示例:
public synchronized void methodA() {methodB();
}public synchronized void methodB() {// 执行某些操作
}
在上述示例中,methodA
和 methodB
都是同步方法。当一个线程调用 methodA
时,它已经获得了该对象的锁。随后,它调用 methodB
,如果锁不是可重入的,线程将会被阻塞,导致死锁。但由于 Java 的 synchronized
是可重入的,线程可以顺利进入 methodB
。
🧵 synchronized
和 ReentrantLock
的可重入性
-
synchronized
:Java 的内置同步机制,使用对象的监视器锁。它是可重入的,允许同一线程多次进入同步代码块。 -
ReentrantLock
:位于java.util.concurrent.locks
包中,提供了与synchronized
相似的功能,但具有更多的灵活性,如可中断的锁获取、尝试获取锁以及公平性设置等。它也是可重入的,允许同一线程多次获取锁,每次获取都需要对应的释放。
🔒 可重入锁的意义
可重入锁的主要意义在于防止死锁,尤其是在以下场景中:
-
嵌套调用:一个同步方法调用另一个同步方法,如果锁不可重入,线程将会被自己阻塞,导致死锁。
-
递归调用:方法递归调用自身,并且每次调用都需要获取同一锁,如果锁不可重入,将会导致死锁。
通过使用可重入锁,线程可以在持有锁的情况下再次获取锁,避免了上述问题。
✅ 总结
可重入锁是多线程编程中的重要机制,它允许同一线程多次获取同一锁,防止在嵌套或递归调用中发生死锁。Java 提供了两种主要的可重入锁:内置的 synchronized
和 ReentrantLock
。根据具体需求选择合适的锁机制,可以提高程序的安全性和性能。