①遵循最小化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 }
ReentrantReadWriteLock 实现了 ReadWriteLock 接口( 注意,ReentrantReadWriteLock 并没有实现 Lock 接口 ),其包含两个很重要的方法:readLock() 和 writeLock() 分别用来获取内部类读锁和写锁,并且这两个锁实现了Lock接口。
体会这样设计的妙处:
读写锁ReentrantReadWriteLock更强调的是获取读写锁的功能,所以实现ReadWriteLock接口,而不管是读锁还是写锁,都是??,要具备锁的功能,所以实现Lock接口。一句话:彼此的侧重点不同。
原文:https://www.cnblogs.com/tombky/p/12664360.html