可重入锁
boolean isLocked = false;
Thread lockedBy = null;
int lockedCount = 0;
public synchronized void lock() throws InterruptedException {
Thread thread = Thread.currentThread();
while (isLocked && thread != lockedBy) {
wait();
}
lockedBy = thread;
lockedCount++;
isLocked = true;
}
public synchronized void unlock() {
if (Thread.currentThread() == lockedBy) {
--lockedCount;
if (lockedCount == 0) {
isLocked = false;
notify();
}
}
}
理解:可重入锁线程获取一个锁以后还可以继续获取锁,但是获取几次锁,最后也要释放几次锁。
不可重入锁
private boolean isLocked = false;
public synchronized void lock() throws InterruptedException{
while(isLocked){
wait();
}
isLocked = true;
}
public synchronized void unlock(){
isLocked = false;
notify();
}
理解:当一个线程获取锁之后且在没有释放锁之前,再次获取锁会失败(死锁)。即只能获取一次锁。