关于CopyOnWriteArrayList源码的疑惑

jdk concurrent包当中的CopyOnWriteArrayList定义了一个数组和一个锁:
private volatile transient Object[] array;
transient final ReentrantLock lock = new ReentrantLock();

他的add方法如下:
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(); } }

问题:
add方法中的final ReentrantLock lock = this.lock;这一句是不是必须的?为什么又定义了一个锁,并且实质用的还是全局定义的那个锁。如果直接用this.lock可不可以?
如果不用getArray直接写成
int len = array.length; Object[] newElements = Arrays.copyOf(array, len + 1); newElements[len] = o; array = newElements;
是不是也可以?

查看回复