重入锁
定义
所谓重入锁,指的是以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的。
synchronized
和 ReentrantLock
都是可重入锁
可重入锁的意义在于防止死锁
不可重入锁
不可重入锁与上面对应,也是以线程为单位,只能获取一次,再次获取时会产生死锁的现象。
重入锁代码示例
public class ReLock {
boolean isLocked = false;
Thread lockedBy = null;
int lockedCount = 0;
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();
}
}
}
}
不可重入锁代码示例
public class Lock {
private boolean isLocked = false;
public synchronized void lock() throws InterruptedException {
while(isLocked){
wait();
}
isLocked = true;
}
public synchronized void unlock() {
isLocked = false;
notify();
}
}