不可重入锁
指的是同一个线程已经获取到锁后再次获取锁时获取不到,线程会被挂起,这就叫不可重入锁。代码如下:
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class UnReentLockDemo {
private boolean isLocked;
//lock方法
public synchronized void lock() throws InterruptedException {
while(isLocked){
wait();
}
isLocked=true;
}
//unlock方法
public synchronized void unLock(){
isLocked=false;
notify();
}
}
当外部线程调用两次lock方法时线程会被挂起
可重入锁
同一个线程已经获取到锁后再次获取锁时可以获取,其他线程获取锁时线程会被挂起
public class ReentLockDemo {
private boolean isLocked;
private Thread thread;
private int i;
private synchronized void lock() throws InterruptedException {
if(isLocked && thread!=Thread.currentThread()){
wait();
}
i++;
isLocked=true;
thread=Thread.currentThread();
}
private synchronized void unLock(){
if(thread==Thread.currentThread()){
i--;
if(i==0){
isLocked=false;
notify();
}
}
}
}
我们思考下:要达到这个目的,首先要有三个要素,1,区别线程的标识 2,线程的锁状态 3,线程获取锁的计数器(因为存在这样一种情况,当连续多次调用lock方法获取锁必须多次释放锁,最后一次释放完才能更改锁的状态,唤醒其他等待锁的线程)
这就对应了代码中的三个成员变量。
java中典型的可重入锁的实现(synchronized和ReentrantLock)