CPU 乱序执行(指令重排序)

先来看一个比较形象的例子:

目前 CPU 相比内存至少快 100 倍,为了提升执行效率,CPU 会在不影响最终结果的情况下对指令进行重排序,如下,CPU 接收到的指令集是:洗水壶 -> 烧水 -> 洗茶壶 -> 洗水杯,其中‘烧水’是必须依赖‘洗水壶’,这种情况下 CPU 是按照正常的顺序往下执行,但是‘烧水’和‘洗茶壶’、‘洗水杯’是完全没有依赖关系,那么这个时候 CPU 会在烧水的同时执行‘洗茶壶’、‘洗水杯’的指令,这时候你会发现因为 CPU 的指令重排序让整个过程的执行效率有明显提升。

Java验证指令重排序

验证代码如下,我们假设没有指令重排序,那么无论是 t1 还是 t2 线程先开始执行,最后的结果一定是在 x 和 y 中至少有一个为 1。但是如果出现 x 和 y 都等于 0,那么就能确定有发生指令重排序。

下面这个代码的执行时间有可能比较长。

package cn.frantic.learning.jvm;

import org.springframework.util.StopWatch;

public class T07_Disorder {
	
	public static int a,b,x,y;
	
	public static void main(String[] args) throws Exception {
		StopWatch s = new StopWatch();
		
		s.start();
		int i = 0;
		while(true) {
			i++;
			
			Thread t1 = new Thread(()->{
				a = 1;
				x = b;
			}); 
			
			Thread t2 = new Thread(()->{
				b = 1;
				y = a;
			});
			
			t1.start();
			t2.start();
			t1.join();
			t2.join();
			
			if( x == 0 && y == 0) {
				s.stop();
				System.out.println("第" + i + "次:x="+x + ",y=" + y );
				System.out.println(s.prettyPrint());
				break;
			}
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值