为了账号安全,请及时绑定邮箱和手机立即绑定

java中final修饰基本变量后的效率问题

java中final修饰基本变量后的效率问题

摇曳的蔷薇 2019-03-07 14:15:41
今天无聊想看下我电脑一秒钟能从0加到多少,就写了这个东西public class TestMultiThread {    static volatile long index = 0;    static boolean flag = true;    public static void main(String[] args){        new Thread(new Runnable() {            @Override            public void run() {                try{                    Thread.sleep(1000);                    System.out.println(index);                    Thread.sleep(1000);                    System.out.println(index);                    Thread.sleep(1000);                    System.out.println(index);                    System.exit(0);                }catch (Exception i){                    i.printStackTrace();                }            }        }).start();        execute();    }    public static void execute(){        while (true){            index++;        }    }}```输出:181768468363750863546204407;后来一想,这个flag变量可以写成final,都说基本类型变量写成static final类型的会提高效率(编译阶段就确定值),于是输出结果变成了。。。132285800264612735396760510what the f...直接将while循环条件写成“true”也是一样的输出。我知道一定是在运行时有一些我不知道的细节导致了这个现象,大家说说自己的看法?
查看完整描述

5 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

不过我实在是没有看明白,楼主想要表达什么。
final修饰符跟效率有关系?这个我不太清楚,从来没有考虑过这个问题呢。
execute() 在你在电脑中i一秒钟能增加到多少我不太清楚,不过看你的逻辑,cpu是要爆炸的吧。
最后我们一般做性能测试,都是根据结果消耗时间换算得来。要知道你这里启动一个线程中间还有sleep唤醒线程,这都需要花时间,计算机运行速度是很快,即使是1毫秒你这个测试结果差距也会很大。

查看完整回答
反对 回复 2019-04-25
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

根据<<JAVA编程思想>>上说的,final在运行时候确实会有性能上的差异,但是呢,我们并不赞同从这个方面去勉强提高所谓的程序性能,而且在编译成class文件的时候,更智能的汇编器应该也会自动的解决这个问题。类似于c++中inline的语法把


查看完整回答
反对 回复 2019-04-25
?
FFIVE

TA贡献1797条经验 获得超6个赞

final 确实会提高效率,但是原理我并不是很清楚,估计在百度上应该能搜出来。大概的原因有如下一些

  • final 变量在编译的时候可以被优化成常量或常数,从而提高性能(影响微小)

  • final 方法。相对于 C++ 来说,Java 方法默认是 virtual 的,所以会有方法链啊,动态绑定啊之类的事情要干,而 final 就是把方法申明为非 virtual 的,不再需要这些动态特性支持,从而提高性能

  • final 类是不可继承的类,大概也是能减少继承相关的一些处理吧

总的来说 final 能提高性能是对的,但是用 final 主要还是从静态检查的安全角度考虑,而不是从性能去考虑,除非实则项目中改成 final 之后性能有较高的提升。平时开发的时候对不需要改变的变量、类型添加 final 修饰还是个比较好的习惯,毕竟在需要的时候去掉 final 不会对以前的程序造成太大的影响,不过对方法加 final 就要慎重了。


查看完整回答
反对 回复 2019-04-25
  • 5 回答
  • 0 关注
  • 709 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号