java中常见问题归集

一、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 }

 

二、ReentrantReadWriteLock设计的细节

  ReentrantReadWriteLock 实现了 ReadWriteLock 接口( 注意,ReentrantReadWriteLock 并没有实现 Lock 接口 ),其包含两个很重要的方法:readLock() 和 writeLock() 分别用来获取内部类读锁和写锁,并且这两个锁实现了Lock接口。

  体会这样设计的妙处:

        读写锁ReentrantReadWriteLock更强调的是获取读写锁的功能,所以实现ReadWriteLock接口,而不管是读锁还是写锁,都是,要具备锁的功能,所以实现Lock接口。一句话:彼此的侧重点不同。



你可能感兴趣的:(java中常见问题归集)