不可重入锁
当前线程已经获取了锁,当这个线程再次尝试获取这个锁的时候就会获取不到被阻塞,我们来写一个不可重入锁的例子。
class Lock{
private boolean lock = false;
/**
* 加锁
* 当lock = true;说明当前对象拿着锁
*/
public synchronized void lock() throws Exception{
while(lock){
wait();
}
lock = true;
}
public synchronized void unlock(){
lock = false;
notify();
}
}
可重入锁
当前线程获取了该锁之后还可以再次获取该锁。
class Lock2{
private boolean lock = false;
private Thread lockBy = null;
private int lockCount = 0;
public synchronized void lock() throws Exception{
Thread thread = Thread.currentThread();
while(lock && lockBy != thread){
wait();
}
lock = true;
lockBy = thread;
lockCount ++;
}
public synchronized void unlock(){
if(Thread.currentThread() == lockBy){
lockCount--;
if(lockCount == 0){
lock = false;
notify();
}
}
}
}