可重入锁和不可重入锁
概念区分
当一个线程获得当前实例的锁lock,并且进入了方法A,该线程在方法A没有释放该锁的时候,是否可以再次进入使用该锁的方法B?
不可重入锁:在方法A释放锁之前,不可以再次进入方法B
可重入锁:在方法A释放该锁之前可以再次进入方法B;如ReentrantLock和synchronized
原理分析
不可重入锁的实现:
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;
Threadthread =null;//当前的线程
public void lock()throws InterruptedException{
ThreadcurrentThread = Thread.currentThread();
while(isLocked &&thread!=currentThread){
wait();
}
isLocked =true;
thread =currentThread;
}
public void unLock(){
isLocked =false;
}
}
public class LockClient {
// Lock lock = new Lock();
ReinnerLocklock =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 (InterruptedExceptione) {
e.printStackTrace();
}
}
}