系统相关
首页 > 系统相关> > 线程---操作系统内存模型、java内存模型、线程可见性问题、 指令重排序、Happens-before规则

线程---操作系统内存模型、java内存模型、线程可见性问题、 指令重排序、Happens-before规则

作者:互联网

操作系统内存模型

在这里插入图片描述

Java内存模型

在这里插入图片描述

线程可见性问题

package day0201;

public class ThreadSafe {
	private static int a=0;
	
	public static void main(String[] args) throws Exception {
		Thread threadA = new Thread(() ->{
			System.out.println("threadA"+Thread.currentThread().getName()+"a="+a);
			a=1;
			System.out.println("threadA"+Thread.currentThread().getName()+"a="+a);
		});
		
		Thread threadB = new Thread(()->{
			System.out.println("threadB"+Thread.currentThread().getName()+"a="+a);
			a=1;
			System.out.println("threadB"+Thread.currentThread().getName()+"a="+a);
		});
		
		threadA.start();
		threadB.start();
		
		threadA.join();
		threadB.join();
		
		System.out.println("a="+a);
	}
}

结果:
在这里插入图片描述
在这里插入图片描述

指令重排序问题

package day0201;

public class ThreadRecordering {
	private static int a=0;
	private static int b=0;
	private static int x=0;
	private static int y=0;
	
	public static void main(String[] args) throws Exception {
		Thread threadA = new Thread(()->{
			b=1;
			x=a;
		});
		Thread threadB = new Thread(()->{
			a=1;
			y=b;
		});
		threadA.start();
		threadB.start();
		
		threadA.join();
		threadB.join();
		
		System.out.println("x="+x+";y="+y);
	}
}

结果,x=0;y=1或x=1;y=0或x=0;y=0或x=1;y=1(都有可能)
在这里插入图片描述
重排序可能发生再编译器,也可能发生再处理器
在这里插入图片描述

重排序发生的条件

违反了Happens-before规则,就会发生指令重排序

Happens-before规则

林浩吧 发布了143 篇原创文章 · 获赞 13 · 访问量 7906 私信 关注

标签:Thread,threadA,模型,线程,内存,操作,threadB
来源: https://blog.csdn.net/weixin_45335305/article/details/104131505