爲何JDK代碼這樣寫?final ReentrantLock takeLock = this.takeLock

在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();
        }
    }

}
相關文章
相關標籤/搜索