可重入锁和不可重入锁
概念区分
当一个线程获得当前实例的锁lock,并且进入了方法A,该线程在方法A没有释放该锁的时候,是否可以再次进入使用该锁的方法B?
不可重入锁:在方法A释放锁之前,不可以再次进入方法B
可重入锁:在方法A释放该锁之前可以再次进入方法B
原理分析
不可重入锁的实现:
public class Lock {
private boolean isLocked = false;
public void lock() throws InterruptedException{
while(isLocked){//如果已经被获取锁,则当前线程只能等待
wait();
}
isLocked = true;
}
public void unLock(){
isLocked = false;
}
}
可重入锁的实例:
public class ReinnerLock {
private boolean isLocked = false;
Thread thread = null;//当前的线程
public void lock() throws InterruptedException{
Thread currentThread = Thread.currentThread();
while(isLocked && thread!=currentThread){
wait();
}
isLocked = true;
thread = currentThread;
}
public void unLock(){
isLocked = false;
}
}
public class LockClient {
// Lock lock = new Lock();
ReinnerLock lock = new ReinnerLock();
void read() throws InterruptedException{
lock.lock();
System.out.println("read");
read1();
lock.unLock();
}
void read1() throws InterruptedException{
lock.lock();
System.out.println("read1");
lock.unLock();
}
public static void main(String[] args) {
try {
//此时执行结果为 read和read1都能打印出来
//如果使用的锁是 Lock则报IllegalMonitorStateException
new LockClient().read();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}