欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java 内存模型 重排序例子

程序员文章站 2022-05-04 17:25:20
...

1.重排序 理解

重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段

package com.pgf.pool;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/*
作者:pgf
时间:2019年12月20日
描述:当m1 和 m2 发生重排序后,先执行x=b,y=a; 在执行a=1,b=1,最后x=0,y=0
*/
public class JmmTest {

	private int a=0;
	private int b = 0;
	private int x = 1;
	private int y=1;
	
	public void m1(){
		a=1;
		x=b;
	}
	
	public void m2(){
		b=1;
		y=a;
	}
	
	public  void test() throws Exception {
		CyclicBarrier cyc = new CyclicBarrier(2);
		Thread thread1 = new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					cyc.await();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (BrokenBarrierException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				m1();
			}
		},"A");
		
		Thread thread2 = new Thread(new Runnable() {
			
			@Override
			public void run() {
				try {
					cyc.await();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (BrokenBarrierException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				m2();
			}
		},"B");
		
		
		thread1.start();
		thread2.start();
		thread1.join();
		thread1.join();
		
		if(x==0 && y==0){
			System.out.println("重排序了。。。。");
		}
		
	}
	
	
	public static void main(String[] args) throws Exception {
		for(int i=0;i<100000;i++){
			JmmTest jmmTest = new JmmTest();
			jmmTest.test();
		}
	}
	
}

java 内存模型 重排序例子

相关标签: 多线程