资讯专栏INFORMATION COLUMN

编程冷知识 --- 多余的局部变量final

sherlock221 / 2034人阅读

摘要:奇怪的代码行这里第一行为什么加了而且还要声明一个局部变量探寻缘由经过搜索找到的解释本质上是由于内存模型和之间的不同如果我们直接使用函数内使用的执行时序函数仅会保存的指针会在使用的地方通过指针获取对象然后再调用相应方法例如好像还可以接受嘛但

奇怪的代码
JDK 1.8 | java.util.concurrent.locks.ReentrantLock | 125行

/**
 * Performs non-fair tryLock.  tryAcquire is implemented in
 * subclasses, but both need nonfair try for trylock method.
 */
final boolean nonfairTryAcquire(int acquires) {
    final Thread current = Thread.currentThread();
    int c = getState();
    if (c == 0) {
        if (compareAndSetState(0, acquires)) {
            setExclusiveOwnerThread(current);
            return true;
        }
    }
    else if (current == getExclusiveOwnerThread()) {
        int nextc = c + acquires;
        if (nextc < 0) // overflow
            throw new Error("Maximum lock count exceeded");
        setState(nextc);
        return true;
    }
    return false;
}

这里第一行 :

final Thread current = Thread.currentThread();

为什么加了final, 而且还要声明一个局部变量?

探寻缘由

经过搜索, 找到的解释本质上是由于: JVM内存模型 和 OOP 之间的不同.

如果我们直接使用:

    Thread current = Thread.currentThread();

函数内使用current的执行时序:

函数仅会保存current的指针

JVM会在使用current的地方, 通过指针获取Thread对象.

然后再调用相应方法. 例如: current.sleep(1L);

好像还可以接受嘛, 但如果在同一个函数内多次调用呢?
程序会重复 2-3 步骤, 增加代码的性能开销.

JVM 的优化

现在JVM已经可以做到在编译期, 针对此种类型的代码调用, 将对象内联到函数的操作数栈中了.
但在JDK中还是保留了大量的final局部变量的使用, 尤其是在并发包内.

我想, 这就是老一辈工程师, 对代码的执着, 对性能的追求, 对自己的约束.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/77575.html

相关文章

  • 前端一些坑,一些记录,一些知识

    摘要:当页面中元素样式的改变并不影响它在文档流中的位置时例如等,浏览器会将新样式赋予给元素并重新绘制它,这个过程称为重绘。 无限期更新前端的一些坑,一些记录,一些冷知识https://github.com/ssshooter/... 大概从 17 年的六月份开始记录吧,也已经一年了,其中也包含了一些很简单的知识,以前还觉得挺难的,现在看起来有点谜之感慨... JavaScript 所有对象...

    Keagan 评论0 收藏0
  • 探究final在java中作用

    摘要:关键字的字面意思是最终的不可修改的这似乎是一个看见名字就大概能知道怎么用的语法但你是否有深究过在各个场景中的具体使用方法注意事项以及背后涉及的设计思想呢一修饰变量基础修饰基本数据类型变量和引用数据类型变量相信大家都具备基本的常识被修饰的变量 final关键字的字面意思是最终的, 不可修改的. 这似乎是一个看见名字就大概能知道怎么用的语法, 但你是否有深究过final在各个场景中的具体使用方法...

    Baaaan 评论0 收藏0
  • 探究final在java中作用

    摘要:关键字的字面意思是最终的不可修改的这似乎是一个看见名字就大概能知道怎么用的语法但你是否有深究过在各个场景中的具体使用方法注意事项以及背后涉及的设计思想呢一修饰变量基础修饰基本数据类型变量和引用数据类型变量相信大家都具备基本的常识被修饰的变量 final关键字的字面意思是最终的, 不可修改的. 这似乎是一个看见名字就大概能知道怎么用的语法, 但你是否有深究过final在各个场景中的具体使用方法...

    番茄西红柿 评论0 收藏0
  • 探究final在java中作用

    摘要:关键字的字面意思是最终的不可修改的这似乎是一个看见名字就大概能知道怎么用的语法但你是否有深究过在各个场景中的具体使用方法注意事项以及背后涉及的设计思想呢一修饰变量基础修饰基本数据类型变量和引用数据类型变量相信大家都具备基本的常识被修饰的变量 final关键字的字面意思是最终的, 不可修改的. 这似乎是一个看见名字就大概能知道怎么用的语法, 但你是否有深究过final在各个场景中的具体使用方法...

    番茄西红柿 评论0 收藏0
  • Java编程中那些再熟悉不过知识点(持续更新)

    摘要:语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。有针对不同系统的特定实现,,,目的是使用相同的字节码,它们都会给出相同的结果。项目主要基于捐赠的源代码。 本文来自于我的慕课网手记:Java编程中那些再熟悉不过的知识点,转载请保留链接 ;) 1. 面向对象和面向过程的区别 面向过程 优点: 性能比面向对象高。因为类调用时需要实例...

    taowen 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<