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

线程指令重排[通俗易懂]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();
		
	}
}

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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • php phantomjs 截屏,phantomjs截图

    php phantomjs 截屏,phantomjs截图废话不多说,直接上代码。功能:随便截取一个url页面:https://www.baidu.com/s?word=phantomjs+%E6%88%AA%E5%9B%BE&tn=43061099_196_hao_pg&ie=utf-8&ssl_sample=hao_1phantomjs的js环境test.jssystem=require(‘system’)address…

    2022年7月14日
    18
  • csgo88skins_csgo开箱网站yesskins

    csgo88skins_csgo开箱网站yesskins88skins国内CSGO开箱网站已合并至88steam官方链接:88skins.com取回状态:饰品需要兑换取回优惠码:csgo(注册使用GOGO推广码免费获得3-20元随机奖励)

    2022年10月5日
    4
  • 全球首款AI芯片_全球AI五强

    全球首款AI芯片_全球AI五强前言你一定听说过CPU、GPU,但是TPU、VPU、NPU、XPU…等等其他字母开头的“xPU”呢?AI概念在几年前火爆全球,科技巨头们纷纷投入AI芯片的研发,小公司也致力于提出概念靠AI浪潮融资,为了快速在AI市场上立足,也为了让市场和用户能记住自家的产品,各家在芯片命名方面都下了点功夫,既要独特,又要和公司产品契合,还要朗朗上口,也要容易让人记住。前文所提到的“xPU”的命名方式就深受各大厂商的喜爱。本文就从字母A到Z来盘点一下目前各种“xPU”命名AI芯片,以及芯片行业里的各种“xPU

    2025年7月10日
    4
  • 几款Android 应用自动化测试工具「建议收藏」

    简述:本文介绍几款流行的Android应用自动化测试工具。Monkey测试:随机测试,压力测试,运行在模拟器或实际设备中。MonkeyRunner测试:操作简单,可录制测试脚本,可视化操作,主要生成坐标的自动化操作,移植性不强Robotium 测试Ronaorex 测试Appium测试UIAutomator测试Test

    2022年4月11日
    97
  • 关于sql和MySQL的语句执行顺序(必看)「建议收藏」

    关于sql和MySQL的语句执行顺序(必看)「建议收藏」今天遇到一个问题就是mysql中insertinto和update以及delete语句中能使用as别名吗?目前还在查看,但是在查阅资料时发现了一些有益的知识,给大家分享一下,就是关于sql以及MySQL语句执行顺序:sql和mysql执行顺序,发现内部机制是一样的。最大区别是在别名的引用上。一、sql执行顺序(1)from(3)join(2)on(4)where…

    2022年6月21日
    20
  • Perl 正则表达式替换

    Perl 正则表达式替换文本处理中经常需要将字符串中的某些字符替换后再进行处理,以下是新发现的非常方便的方法,充分发挥了Perl正则表达式的威力。$str=”thisisatesting”;$str=~s/(/w+)(/w+)/$2$1/;print$str;————————————OUTPUT:isthisatesti

    2022年5月6日
    118

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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