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;
是不是也可以?
问题已赞.
应该还有性能上的考虑. 在java函数栈帧的本地变量里存入对 域成员对象的引用, 相当于一个空间换时间的做法. 毕竟 取本地变量 只需要 aload_x 一条指令; 而取 域成员对象的话, 需要 aload_0 [this], getfield 两条指令. 且每次从 栈里取值, 应该还有缓存上的 好处.