在CopyOnWriteArrayList的源码中有一个细节值得学习,就是在addIfAbsent方法中ReentrantLock的用法,
先是将一个这个成员变量this.lock从新赋值给一个局部变量lock以后再使用它,貌似跟java的内存模型有关,具体说明参考这篇文章:
https://www.jianshu.com/p/04236d63f055
public class CopyOnWriteArrayList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { final transient ReentrantLock lock = new ReentrantLock(); private boolean addIfAbsent(E e, Object[] snapshot) { // 开发过程当中尽可能将全局变量重赋给局部变量,尤为用局部变量作循环的状况 // 会必定程度上提高性能,也应该是代码的通常原则(general principle)。 final ReentrantLock lock = this.lock; lock.lock(); try { ...... ...... } finally { lock.unlock(); } } }