问题描述
进行线程安全学习时,发现的Lock接口中lock方法与unlock方法在try-catch-finally代码块中位置的区别
问题分析:
//获得锁对象
Lock lock = new ReentrantLock();
//加锁
lock.lock();
try {
//执行同步代码块
} catch () {
//捕捉异常
}finally {
//解锁
lock.unlock();
}
unlock() 方法应该放在finally{ }中,是为了避免异常出现时,仍然处于加锁状态,而导致线程的死锁,即无论是否产生异常,都能正常的解锁,保证线程安全。
lock() 方法若放在try-catch代码块的内部,即:
//获得锁对象
Lock lock = new ReentrantLock();
try {
//加锁
lock.lock();
//执行同步代码块
} catch () {
//捕捉异常
}finally {
//解锁
lock.unlock();
}
此时若在执行lock.lock()代码行时出现了异常,catch执行之后则直接进入finally代码块进行解锁,而此时当前线程并没有持有lock对象锁,进行解锁操作会产生IllegalMonitorStateException 异常
结论:
Lock接口中lock方法应该放在try-catch-finally外部