java中final修饰基本变量后的效率问题 财富值43

2016-09-29 07:33发布

今天无聊想看下我电脑一秒钟能从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++;         }     } }``` 输出: 181768468 363750863 546204407; 后来一想,这个flag变量可以写成final,都说基本类型变量写成static final类型的会提高效率(编译阶段就确定值),于是输出结果变成了。。。 132285800 264612735 396760510 what the f... 直接将while循环条件写成“true”也是一样的输出。 我知道一定是在运行时有一些我不知道的细节导致了这个现象,大家说说自己的看法?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
9条回答

当使用static的时候,线程执行的时候会在线程栈里为其添加一个copy,以后引用的就是线程栈内的变量。使用final或直接使用true,感觉是一回事,这个变量就不是变量了,而是一个固定的值,boolean就两个值,在虚拟机启动的时候就确定了,存储位置应该也是在一个固定的区域(perm)了。因为访问栈内数据的速度要快于访问那个‘固定区域’的速度,所以就出现了你得到的结果啦。

一周热门 更多>