为什么JDK代码这样写?final ReentrantLock takeLock = this.takeLock

Posted jun1019

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么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();
        
    

 

以上是关于为什么JDK代码这样写?final ReentrantLock takeLock = this.takeLock的主要内容,如果未能解决你的问题,请参考以下文章

finally类

为什么jdk中把String类设计成final

java-为什么非静态内部类中不能有static修饰的属性,但却可以有final常量?

Junit 测试不适用于 Drools 5.4.0.Final 和 JDK 8

java finally深入探究

JDK7中匿名内部类中使用局部变量要加final,JDK8中不需要,但jdk会默认加上final