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

线程指令重排[通俗易懂]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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • h3c路由器常用命令汇总_h3c命令手册

    h3c路由器常用命令汇总_h3c命令手册1、进入系统视图模式system-view2、为设备命名sysname3、显示当前配置displaycurrent-configuration4、中英文切换language-modeChinese|English5、进入以太网端口视图interfaceEthernet1/0/16、设置端口访问模式portlink-typeAccess|Trunk|Hybrid7、激活以太网端口undoshutdown8、关闭以太网端口shut

    2022年10月18日
    3
  • Linux系统内核笔记[通俗易懂]

    Linux系统内核笔记[通俗易懂]一、课程介绍UNIX/Linux环境C语言,借助学习操作系统的接口的方法来学习、理解操作系统的运行机制以及一些网络协议C/C++、数据结构和算法与平台无关,重点是算法逻辑Uinx/Linux/Android/IOS平台相关,系统接口嵌入式/驱动/移植硬件相关,硬件接口 环境介绍 内存管理 文件操作 文件管理 信号处理 进程管理 进程通信 网络通信 线程管理 线程…

    2022年6月4日
    24
  • 2021 goland激活码【在线破解激活】[通俗易懂]

    2021 goland激活码【在线破解激活】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
    77
  • MySQL中concat函数

    MySQL中concat函数

    2021年9月18日
    58
  • 数据仓库ods层_app数据仓库搭建

    数据仓库ods层_app数据仓库搭建8.数据仓库之ODS层搭建

    2022年10月5日
    4
  • GoDaddy免费空间详情

    GoDaddy免费空间详情导读:  在GoDaddy任意购买一个域名后就可以得到一个免费空间  空间大小是5G,流量限制是25G,文件大小不限,带广告(可去除),PHP或者ASP,数据库为MSSQL或者Access。  我现在用的GoDaddy免费空间是Linux(可选Windows),因为之前用的Windows因IP早已被封,所以将其删掉而重新选择了一个Linux。  免费空间换IP的方法只有一个:更换换主机类

    2022年7月11日
    23

发表回复

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

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