指令重排:

news2024/9/21 12:47:53

目录

指令重排:

代码:

执行结果:

分析原因:

解决办法:

加入语句:

完整代码:

补充:  

1.printStackTrace();

2.yield()


指令重排:

在class文件执行的时候,cpu为了提高执行的效率,可能会打乱代码编写的顺序,在多线程的情况下,指令重排可能会带来小概率的偶先错误

代码:

package com.iweb.test;
public class Test3 {
    static Test3 test3;
    static Boolean isInit;
    static int count = 1;
    public static void main(String[] args) {
        while (true) {
            isInit = false;
            test3 = null;
//创建一个test3对象,用静态方法进行调用
            Thread thread1 = new Thread(() -> {
                test3 = new Test3();
                isInit = true;
            });
            Thread thread2 = new Thread(() -> {
                try {
                    if (isInit)
                        test3.doSomething();
                } catch (Exception e) {
                    System.out.println("终于发生了指令重排");
                    e.printStackTrace();
                    System.exit(1);//跳出系统

                }
            });
            thread1.start();
            thread2.start();

        }


    }

    public void doSomething() {
        System.out.println("实验做到了" + count++ + "次");
    }
}


执行结果:

分析原因:

可以看到在188次发生了指令重排 ,发生了空指针异常,没有创建test3对象时,即调用test3.doSomething,thread1或者thread2还没结束就开启下一次循环

解决办法:

主线程必须要等这次实验做完,才能开启循环去做下一次实验

加入语句:

如果thread1或者thread2还没结束:主线程让出cpu

  while(thread1.isAlive()||thread2.isAlive()){
                Thread.yield();
            }

完整代码:

package com.iweb.test;
public class Test3 {
    static Test3 test3;
    static Boolean isInit;
    static int count = 1;
    public static void main(String[] args) {
        while (true) {
            isInit = false;
            test3 = null;
            Thread thread1 = new Thread(() -> {
                test3 = new Test3();
                isInit = true;
            });
            Thread thread2 = new Thread(() -> {
                try {
                    if (isInit)
                        test3.doSomething();
                } catch (Exception e) {
                    System.out.println("终于发生了指令重排");
                    e.printStackTrace();
                    System.exit(1);

                }
            });
            thread1.start();
            thread2.start();
            while(thread1.isAlive()||thread2.isAlive()){
                Thread.yield();
            }
        }

    }

    public void doSomething() {
        System.out.println("实验做到了" + count++ + "次");
    }
}


执行结果:在32w次左右发生了 thread1和thread2的顺序打乱

进一步解决:

在变量中加入volatile

 static volatile Test3 test3;
    static volatile Boolean isInit;

补充:  

1.printStackTrace();

try{
    //逻辑代码
}
catch(Exception e){
   e.printStackTrace();
}

上述代码里的 e.printStackTrace()是什么意思呢?

当Java代码在运行过程中遇到异常时,代码运行会跳到catch代码快,捕获异常,实例化Exception类型的对象,e是该对象的名称,printStackTrace是该对象的一个方法,从printStackTrace的名称我们可以看到是用于打印某些东西,那么是打印什么东西呢?解释如下:

printStackTrace()方法的意思是:在命令行打印异常信息在程序中出错的位置及原因。

printStackTrace打印的是出现异常的详细信息,出错位置,对于指明错误原因有很大的帮助。

2.yield()

yield方法的功能

 暂停当前正在执行的线程对象 
 并执行其他线程

注意事项
   其他也包含当前线程
 


                        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1951201.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OAK-FFC 分体式相机使用入门介绍

概述 OAK FFC 主控板和多种可选配镜头模组非常适合灵活的搭建您的3D人工智能产品原型。由于镜头是分体式的,因此你可以根据需要测量的距离,自定义深度相机安装基线,并根据你的项目要求(分辨率、快门类型、FPS、光学元件&#xff…

【C++】选择结构-switch语句

switch 语句语法格式: switch (已定义整型或字符型变量名) { case 单个整型或字符型1: 满足这个 case 下整型或字符型执行的操作 break; case 单个整型或字符型2: 满足这个 case 下整型或字符型执行的操作 break; ...... default : 所有 ca…

SpringBoot3整合Druid报错Cannot load driver class: org.h2.Driver

报错显示springboot自带的H2数据库报错,其实是因为druid并未加载进去。如果你其它配置都没问题的话,请检查druid的依赖是什么版本的,因为springboot3刚开始是不支持druid的。 方案一: 即需要手动在resources目录下创建META-INF/s…

opencascade AIS_MouseGesture AIS_MultipleConnectedInteractive源码学习

AIS_MouseGesture //! 鼠标手势 - 同一时刻只能激活一个。 enum AIS_MouseGesture { AIS_MouseGesture_NONE, //!< 无激活手势 // AIS_MouseGesture_SelectRectangle, //!< 矩形选择&#xff1b; //! 按下按钮开始&#xff0c;移动鼠标定义矩形&…

队列--顺序队列的表示和实现

#include<stdio.h> #define MAXQSIZE 10 typedef int QElemType; typedef int Status; //顺序队列 (循环队列,有一个空间不用) typedef struct{QElemType *base;int rear;int front; }SqQueue; //初始化队列 Status InitQueue(SqQueue &Q){Q.basenew QElemType[MAX…

微信Android一面凉经(2024)

微信Android一面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《微信Android一面凉经(2024)》。 面试职位: 微信-客户端开发工程师-基础功能(广州) And…

数据结构——二叉树性质

性质1:在二叉树的第i层上至多有2^(i-1)个结点(i>1)。 这个性质很好记忆&#xff0c;观察一下图6-5-5。 第一层是根结点&#xff0c;只有一个&#xff0c;所以2^(1-1)2^01。 第二层有两个&#xff0c;2^(2-1)22。 第三层有四个&#xff0c;2^(3-1)2^24。 第四层有八个&am…

centos7 mysql 基本测试(6)主从简单测试

centos7 xtrabackup mysql 基本测试&#xff08;6&#xff09;主从简单测试 mysql -u etc -p 1234aA~1 参考&#xff1a; centos7 时区设置 时间同步 https://blog.csdn.net/wowocpp/article/details/135931129 Mysql数据库&#xff1a;主从复制与读写分离 https://blog.csd…

【中项】系统集成项目管理工程师-第5章 软件工程-5.3软件设计

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

800G以太网测试之FEC压力测试(FEC统计,FEC Error Injection)

目录 FEC是什么 FEC测试需要关注哪些内容 基础的 FEC 性能监测 需要测试和验证的 FEC 特性 FEC Error Injection / FEC误码压力测试 Codeword & Symbol Error Configuration Errored Symbol Per CW Configuration Bit Error Mask Configuration Loop Mode FEC 引擎…

JavaScript Let

ECMAScript 2015 ES2015 引入了两个重要的 JavaScript 新关键词&#xff1a;let 和 const。 这两个关键字在 JavaScript 中提供了块作用域&#xff08;Block Scope&#xff09;变量&#xff08;和常量&#xff09;。 在 ES2015 之前&#xff0c;JavaScript 只有两种类型的作…

为边缘开发由生成式 AI 驱动的视觉 AI 智能体

为边缘开发由生成式 AI 驱动的视觉 AI 智能体 文章目录 为边缘开发由生成式 AI 驱动的视觉 AI 智能体什么是可视化 AI 智能体&#xff1f;使用 Jetson 平台服务为边缘构建视觉 AI 智能体构建基于 VLM 的视觉 AI 智能体应用程序VLM AI 服务提示工程与 Jetson 平台服务和移动应用…

针对网络延迟与弱网下的测试

学习的时候看见大佬这样的回复 作为一个测试小白&#xff0c;我心想&#xff0c;这我不得上手试一试 大佬说的工具模拟&#xff0c;大概是指Charles和fiddler两个软件&#xff0c;都可以模拟弱网&#xff0c;但是Charles收费&#xff0c;我拿fiddler练手 另一个故意引入固定百…

21-C语言的结构体尺寸——地址对齐问题

21-C语言的结构体尺寸——地址对齐问题 文章目录 21-C语言的结构体尺寸——地址对齐问题一、CPU 字长二、 地址对齐2.1 原理和原因2.2 地址对齐的主要思想2.3 示例代码说明地址对齐 三、普通变量的M值M值的计算规则例子 四、手动干预M值4.1 规则4.2 例子 五、结构体的M值5.1 例…

每天一个设计模式之职责链模式(第一天)

特别感谢刘伟老师&#xff0c;看他的书我学到了很多东西&#xff0c;从今天开始我要开始更新啦&#xff01; 在csdn个人博客来总结知识&#xff0c;把他们变成自己的能力。 对三&#xff0c;要不起&#xff0c;张三李四王五几个人在玩斗地主&#xff0c;过过过&#xff0c;一…

谷粒商城实战笔记-错误记录-启动失败

文章目录 一&#xff0c;lombok报错二&#xff0c;Output directory is not specified 一&#xff0c;lombok报错 java: You arent using a compiler supported by lombok, so lombok will not work and has been disabled. Your processor is: com.sun.proxy.$Proxy8 Lombok …

靶场实战 _ ATTCK 实战 Vulnstack 红队

环境配置 网络拓扑图 (仅供参考) 攻击机&#xff1a;kali ip:192.168.111.5靶机&#xff1a;web-centos 外网ip:192.168.111.10 内网ip:192.168.93.100web1-ubuntu ip: 192.168.93.120PC ip: 192.168.93.30win 2008 ip:192.168.93.20win 2012 ip:192.168.93.10 信息搜集 端口…

【QT】常用控件(概述、QWidget核心属性、按钮类控件、显示类控件、输入类控件、多元素控件、容器类控件、布局管理器)

一、控件概述 Widget 是 Qt 中的核心概念&#xff0c;英文原义是 “小部件”&#xff0c;此处也把它翻译为 “控件”。控件是构成一个图形化界面的基本要素。 像上述示例中的按钮、列表视图、树形视图、单行输入框、多行输入框、滚动条、下拉框都可以称为 “控件”。 Qt 作为…

世界渲染大赛含金量高吗?含金量怎么样?水平要求?

世界渲染大赛&#xff0c;作为全球3D艺术与渲染领域的顶级赛事&#xff0c;以其高含金量和专业水平要求而闻名。这一赛事不仅吸引了世界各地的专业3D艺术家、设计师和技术爱好者的积极参与&#xff0c;更以其严格的评审标准和创新性的主题设置&#xff0c;确保了参赛作品的高质…

C#初级——条件判断语句、循环语句和运算符

条件判断语句 简单的条件判断语句&#xff0c;if()里面进行条件判断&#xff0c;如果条件判断正确就执行语句块1&#xff0c;如果不符合就执行语句块2。 if (条件判断) { 语句块1 } else { 语句块2 } int age 18;if (age < 18){Console.WriteLine("未…