HappenBefore 指令重排

代码执行顺序与预期不一致:编译器/cpu尝试重排指令,使代码更快的执行,一般发生在代码与代码之间没有相互的之间联系(依赖)
代码编译之后-》汇编:1、取指 2、解码 从寄存器取值 3、操作 4、操作结果写回寄存器
若写回太慢,且下一条指令与当前操作有依赖,则会继续观察下一条指令是否有依赖,没有则执行 从而在多线程中可能会存在问题
HappenBefore 指令重排_第1张图片

public class HappenBefore {
	//变量1
	private static int a=0;
	//变量2
	private static boolean flag=false;
	public static void main(String[] args) throws InterruptedException {
		
		//线程1 更改数据
		Thread t1=new Thread(()->{
			a=1;
			flag=true;
			System.out.println(Thread.currentThread().getName());
		},"job1");
		//线程2 读取数据
		Thread t2=new Thread(()->{
			if(flag) {
				System.out.println("zjj---");
				a*=1;
			}
			//指令重排 数据之间没有依赖
			if(a==0) {
				System.out.println("nums"+Thread.activeCount()+""+Thread.currentThread().getName()+"happen before-->"+a);
			}
		},"job2");
		t1.start();
		t2.start();
		
		//合并线程 线程的插队
		t1.join();
		t2.join();
	}
}

java线程-工作空间-|
java线程-工作空间-|–》【load/save】-主内存
java线程-工作空间-|

你可能感兴趣的:(#,多线程)