今天无聊想看下我电脑一秒钟能从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”也是一样的输出。
我知道一定是在运行时有一些我不知道的细节导致了这个现象,大家说说自己的看法?
当使用
static
的时候,线程执行的时候会在线程栈里为其添加一个copy,以后引用的就是线程栈内的变量。使用final
或直接使用true
,感觉是一回事,这个变量就不是变量了,而是一个固定的值,boolean
就两个值,在虚拟机启动的时候就确定了,存储位置应该也是在一个固定的区域(perm)了。因为访问栈内数据的速度要快于访问那个‘固定区域’的速度,所以就出现了你得到的结果啦。还有,final对性能的提升主要是针对方法来说的,它能使得在编译的时候就确定哪个方法会被访问而不是动态绑定。所谓的性能提升就表现在这里,提升的有限。举个例子: