线程指令重排[通俗易懂]

线程指令重排[通俗易懂]1、指令重排JVM为优化执行效率对线程内的执行顺序进行重排,对单线程来说执行指令重排并不会影响程序从上到下执行的代码逻辑。但是在多线程的情况下,则可能会出现问题。2、指令重排原则程序顺序原则:一个线程内保证语义的串行性volatile规则:volatile变量的写,先发生于读锁规则:解锁(unlock)必然发生在随后的加锁(lock)前传递性:A先于B,B先于C那么A必然先于C线程的start方…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

1、指令重排

JVM为优化执行效率对线程内的执行顺序进行重排,对单线程来说执行指令重排并不会影响程序从上到下执行的代码逻辑。但是在多线程的情况下,则可能会出现问题。

2、指令重排原则

程序顺序原则:一个线程内保证语义的串行性

volatile规则:volatile变量的写,先发生于读

锁规则:解锁(unlock)必然发生在随后的加锁(lock)前

传递性:A先于B,B先于C 那么A必然先于C

线程的start方法先于它的每一个动作

线程的所有操作先于线程的终结(Thread.join())

线程的中断(interrupt())先于被中断线程的代码

对象的构造函数执行结束先于finalize()方法

3、代码示例(实际演示中没有演示出效果快哭了

package com.thread.study;

public class OrderExample {
	
	int a = 0;
	boolean  flag = false;
	
	public void write(){
		a = 1;
		flag = true;
	}
	
	public void read(){
		if(flag){
			int i = a + 1;
			System.err.println("i="+i+"a="+a+"flag="+flag);
		}
	}
	
	public static void main(String[] args){
		
		OrderExample order = new OrderExample();
		
		//A线程执行write方法,但是无法保证 a=1执行在前,flag = true执行在后
		Thread threadA = new Thread(new Runnable(){
			@Override
			public void run() {
				order.write();
		}});
		//线程 B执行read方法
		Thread threadB = new Thread(new Runnable(){
			@Override
			public void run() {
				order.read();
		}});
		threadA.start();
		threadB.start();
		
	}
}

4、避免指令重排

指令重排是编译器的一种优化手段,但是在多线程中可能会影响到代码逻辑。如何避免指令重排可以通过同步的方式(性能问题)

package com.thread.study;

public class OrderExample {
	
	int a = 0;
	boolean  flag = false;
	
	public synchronized void write(){
		a = 1;
		flag = true;
	}
	
	public synchronized void read(){
		if(flag){
			int i = a + 1;
			System.err.println("i="+i+"a="+a+"flag="+flag);
		}
	}
	
	public static void main(String[] args){
		
		OrderExample order = new OrderExample();
		
		//A线程执行write方法,但是无法保证 a=1执行在前,flag = true执行在后
		Thread threadA = new Thread(new Runnable(){
			@Override
			public void run() {
				order.write();
		}});
		//线程 B执行read方法
		Thread threadB = new Thread(new Runnable(){
			@Override
			public void run() {
				order.read();
		}});
		threadA.start();
		threadB.start();
		
	}
}

网上看到指令重排会对懒汉-单例模式有影响,后续分析。。。。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/180658.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • X-Windows桌面

    X-Windows桌面

    2021年10月15日
  • DS哈希查找—二次探测再散列

    DS哈希查找—二次探测再散列题目描述定义哈希函数为H(key)=key%11。输入表长(大于、等于11),输入关键字集合,用二次探测再散列构建哈希表,并查找给定关键字。输入测试次数t每组测试数据格式如下:哈希表长m、关键字个数nn个关键字查找次数kk个待查关键字输出对每组测试数据,输出以下信息:构造的哈希表信息,数组中没有关键字的位置输出NULL对k个待查关键字,分别输出:…

  • 【读书笔记】——奇点临近「建议收藏」

    做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!文章目录第一章 六大纪元第二章 技术进化理论:加速回归定律第三章 达到人脑的计算能力=================================================对人工智能感兴趣的伙伴,分享一个我朋友的人工智能教程。零基础!通俗易懂!风趣幽默!大家可以看看是否对自己有帮助,点击这里查看教程。…

  • 基于C++、MySQL的图书销售管理系统

    基于C++、MySQL的图书销售管理系统数据库课程设计报告开发环境与开发工具开发语言:C++、MySQL操作系统:macOSMojaveVersion10.14.5开发工具:XcodeIDE、iTerm命令行终端终端环境:iTerm+zsh、Xcode终端调试台MySQLServer版本:5.7.25MySQLCommunityServer(GPL)运行方式:cd到目录下make可完成编译连接,而后直接./bsms即可运行系统需求分析  当今的图书销售行业有数据量大、数据结构复杂、数据变

  • 电脑设备管理器没有调制解调器_电脑里没有调制解调器

    电脑设备管理器没有调制解调器_电脑里没有调制解调器泼冷水丶回答数:5138|被采纳数:532017-01-0910:55:29打开控制面板。我们的很多操作都在控制面板里实现完成的。查看是否安装过BlueSoleil驱动。首先确定你的电脑上曾经装过BlueSoleil驱动。如果没有装过这个,装过其他提供调制解调器的驱动也可以。安装的蓝牙调制解调器使用情况。在网上邻居里观察下我们的BluetoothPANNetWorkAdapte…

  • 设备树 之pinctrl[通俗易懂]

    设备树 之pinctrl[通俗易懂]三个重要概念bank:gpa0,gpa1,gpa31等group:以功能划分,比如uart的tx和rxstate:设备的某种状态,比如”default”,”idle”,”sleep”,也可以是其他自定义的状态,比如串口的“flow_ctrl”状态例如:bank:&pinctrl_0{/**pinb…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号