一、Java中为何要在try{}语句外Lock锁?
①遵循最小化try-catch范围的原则
查看文档可知
void lock();
lock方法是没有指定抛出的异常的,所以不应当包含到try-catch块中。
unlock放到finally中也是为了保证业务无论异常与否,最终都要解除锁,释放资源避免死锁。
在
try-finally
外加锁,如果因为异常导致加锁失败,try-finally
块中的代码不会执行。相反,如果在try{}
代码块中加锁失败,finally
中的代码无论如何都会执行,但是由于当前线程加锁失败并没有持有lock
对象锁 ,所以程序会抛出异常。
1 Lock lock = ...; 2 lock.lock(); 3 try{ 4 //处理任务 5 }catch(Exception ex){ 6 7 }finally{ 8 lock.unlock(); //释放锁 9 }