Saturday, January 22, 2011

CopyOnWriteArrayList中的设计疑问和原因

最近重新看看java.util.concurrent包中的类源码,发现一个有趣的设计,在CopyOnWriteArrayList中有几个方法都使用了本地引用,如下方法:

    public boolean add(E e) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
   Object[] elements = getArray();
   int len = elements.length;
   Object[] newElements = Arrays.copyOf(elements, len + 1);
   newElements[len] = e;
   setArray(newElements);
   return true;
} finally {
   lock.unlock();
}
    }
如红色代码,很是疑惑,最后在mail-list上发现有人也问下相应的问题。Bowbeer(JCIP作者之一)是这么回答的。
Note that this is a local reference not a local copy. Reusing a local reference eliminates one (slower) instance variable lookup at runtime
大概意思是说本地引用和本地拷贝不同,本地引用可以减少实例在运行时的查找时间。