为什么unlock方法在finally内
- Lock在获取到锁之后,不会主动释放锁,不调用unlock主动释放锁,其他线程将永远无法获取到锁
- 因此为了方式程序中因为出现异常从而没有正确释放锁,需要将unlock方法放在finally块中,保证在获取到锁后一定能够释放锁
ReentrantLock lock = new ReentrantLock();
lock.lock();
try {
} finally {
lock.unlock();
}
为什么lock方法在try外
- 当因为某些情况时,如果此时在lock方法中出现异常,从而导致没有获取锁成功
- 在unlock进行解锁时,因为在unlock方法会先判断当前线程是否持有锁,如果当前线程没有持有锁,会抛出
**IllegalMonitorStateException**
异常 - 这种情况下
**lock方法的异常不会显示**
,被吞掉了,只会显示unlock方法的异常 - 如果在lock方法前还有某些业务操作,这些业务操作的异常也会被吞掉,因此建议将lock方法放在try代码块的第一行
ReentrantLock lock = new ReentrantLock();
try {
lock.lock();
} finally {
lock.unlock();
}