可重入锁:如果某个线程试图获取一个已经由他自己持有的锁,这个请求可以成功,那么此时的锁就是可重入锁
不可重入锁:不可重入锁和可重入锁相反,就是同一个线程多次请求同一把锁,会出现死锁
定义一个不可重入锁:
public class Lock{
//当为false时证明资源没有被线程占用
private boolean isLocked = false;
public synchronized void lock() throws InterruptedException{
//判断为true时,证明该线程之前占用该资源,以为synchronized是可重入锁,所以该线程可以访问资源。此时就让该线程wait,表示该资源只能占用一次。
while(isLocked){
wait();
}
//当该线程第一次进来的时候,将isLocked置位true
isLocked = true;
}
public synchronized void unlock(){
//将isLocked置位false表示该资源被释放,可以让其他线程来访问
isLocked = false;
notify(); //唤醒其他线程
}
}
使用上面的自定义的不可重入锁
public class Count{
Lock lock = new Lock(); //自定义的Lock类
public void print(){
lock.lock();
doAdd();
lock.unlock();
}
public void doAdd(){
lock.lock();
//do something
lock.unlock();
}
}