可重入锁和不可重入锁
时间: 2024-05-07 20:12:37 浏览: 11
可重入锁和不可重入锁是在多线程编程中使用的两种不同类型的锁。
1. 可重入锁(Reentrant Lock):
可重入锁也被称为递归锁,它允许同一个线程多次获取同一个锁而不会造成死锁。当一个线程已经持有了该锁时,它可以再次获取该锁而不会被阻塞。可重入锁通过记录持有锁的线程和计数器来实现。每次获取锁时,计数器加1,每次释放锁时,计数器减1。只有当计数器为0时,其他线程才能获取该锁。
2. 不可重入锁(Non-reentrant Lock):
不可重入锁是一种简单的锁,它不允许同一个线程多次获取同一个锁。如果一个线程已经持有了该锁,再次尝试获取该锁时会被阻塞,从而导致死锁。不可重入锁通常是通过简单的标志位来实现的,当一个线程获取了该锁时,标志位被设置为true,其他线程再次尝试获取该锁时会被阻塞。
相关问题
可重入锁和不可重入锁是什么
可重入锁和不可重入锁是指在多线程编程中使用的两种不同类型的锁。
可重入锁也称为递归锁,是指在一个线程持有锁的时候,可以再次获得同一把锁而不会造成死锁。这种锁可以避免在同一个线程中重复获取同一把锁导致死锁的情况。Java中的ReentrantLock就是一种可重入锁。
不可重入锁则是指在一个线程持有锁的时候,不能再次获得同一把锁,否则会导致死锁。这种锁一旦被某个线程获取,其他线程就无法获取该锁,只能等待持有锁的线程释放。Java中的synchronized就是一种不可重入锁。
不可重入锁案例
不可重入锁(Non-Reentrant Lock)是一种不能被同一个线程多次获取的锁。如果一个线程在持有这个锁时尝试再次获取该锁,那么该线程就会被阻塞,直到该锁被释放。下面是一个不可重入锁的例子:
```java
public class NonReentrantLock {
private boolean isLocked = false;
public synchronized void lock() throws InterruptedException {
while (isLocked) {
wait();
}
isLocked = true;
}
public synchronized void unlock() {
isLocked = false;
notify();
}
}
```
在上面的例子中,我们使用 synchronized 关键字来实现锁。如果一个线程在持有锁时再次尝试获取这个锁,它会在 while 循环中一直等待,直到锁被释放。这种实现方式是不可重入的,因为一个线程在持有锁时不能再次获取该锁,否则会导致死锁。