/**
* @ClassName Lock
* @Description 可重入锁
* @Author Administrator
* @Date 2019/6/8 16:58
* @Version 1.0
**/
public class Lock{
boolean isLocked = false;
Thread lockedBy = null;
int lockedCount = 0;
/**
* 可重入就意味着:线程可以进入任何一个它已经拥有的锁所同步着的代码块
* @throws InterruptedException
*/
/**
* 我们设计两个线程调用print()方法,第一个线程调用print()方法获取锁,进入lock()方法,
* 由于初始lockedBy是null,所以不会进入while而挂起当前线程,
* 而是是增量lockedCount并记录lockBy为第一个线程。接着第一个线程进入doAdd()方法,
* 由于同一进程,所以不会进入while而挂起,接着增量lockedCount,
* 当第二个线程尝试lock,由于isLocked=true,所以他不会获取该锁,
* 直到第一个线程调用两次unlock()将lockCount递减为0,才将标记为isLocked设置为false
* @throws InterruptedException
*/
public synchronized void lock() throws InterruptedException{
Thread thread = Thread.currentThread();
while(isLocked && lockedBy != thread){
wait();
}
isLocked = true;
lockedCount++;
lockedBy = thread;
}
public synchronized void unlock(){
if(Thread.currentThread() == this.lockedBy){
lockedCount--;
if(lockedCount == 0){
isLocked = false;
notify();
}
}
}
}