这是offer方法 ,
public boolean offer(E e) {
        checkNotNull(e);
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            if (count == items.length)
                return false;
            else {
                insert(e);
                return true;
            }
        } finally {
            lock.unlock();
        }
    }为什么要把this.lock赋值给一个新的引用的?直接用lock不行吗 

解决方案 »

  1.   

    新的变量加了final ,目的可能是不想让lock被改变吧。
      

  2.   

    楼主要学会贴代码public class Demo {
        public static void main(String[] args) {
            if (args.length == 0) {
                System.out.println("no args.");
            }
        }
    }像楼主的代码层级多,又没有排版,没法看。
      

  3.   

    这个目的感觉还是多此一举,加了final,还是可以改变this.lock,不如直接用this.lock,暂且以为是编码习惯楼
      

  4.   


    我觉得你没理解我的意思,可能也没理解【真正理解】final的意思。
    以前在写多线程代码,进入run方法的局部变量是必须final的(为什么要这么设计请自行脑补),这里虽然没有run方法,但作者可能有类似这样的意图(尽管可能没有真正用上)。所以为了保证this.lock不被随便改写引用(我禁不住再想问下,你真的明白final修饰的意义么?)
    当然,如果上面的话你完全理解并认同,那当我没说。还有,这帖子1个月没更新了,这习惯得改改哟。
      

  5.   


    我觉得你没理解我的意思,可能也没理解【真正理解】final的意思。
    以前在写多线程代码,进入run方法的局部变量是必须final的(为什么要这么设计请自行脑补),这里虽然没有run方法,但作者可能有类似这样的意图(尽管可能没有真正用上)。所以为了保证this.lock不被随便改写引用(我禁不住再想问下,你真的明白final修饰的意义么?)
    当然,如果上面的话你完全理解并认同,那当我没说。还有,这帖子1个月没更新了,这习惯得改改哟。首先你说的run方法问题  只是局部变量生命周期问题,所以必须用final,以放入内部类的常量池,跟这个没关系
    其次 this.lock变量也是final的,所以根本不存在【随便改写引用的问题】
      

  6.   

    你贴的代码里并没有说明this.lock是final的。
    原谅我没有看ArrayBlockingQueue源码就在这里显摆,不好意思,在你面前班门弄斧了,sorry。