JavaEE(系列5) -- 多线程带来的风险(线程安全)

news2024/11/26 5:23:10

我们直接给出含有一个bug的例子

创建两个线程,各执行5w次自增。正常情况,结果是10w。

初始代码如下:

package threading;
//线程不安全
class Counter{
    private int count=0;
    public void add(){
        count++;
    }
    public int get(){
        return count;
    }
}
public class ThreadDemo10 {
    public static void main(String[] args) throws InterruptedException{
        Counter counter=new Counter();
        //搞两个线程,两个线程分别对这个counter自增5w次
        Thread t1=new Thread(()->{
            for (int i = 0; i <50000 ; i++) {
                counter.add();
            }
        });
        t1.start();
        Thread t2=new Thread(()-> {
            for (int i = 0; i < 50000; i++) {
                counter.add();
            }
        });
        t2.start();
        t1.join();
        t2.join();
        System.out.println(counter.get());
    }
}

 代码执行多次的结果

此时我们就奇怪了,为什对一个变量进行自增,结果的值不是我们想要的. 

解释一下为啥会出现这种情况,和线程的调度随机性密切相关

count++操作,本质上是三个cpu指令的构成

1.load,把内存中的数据读取到cpu寄存器中

2.add,就是把寄存器中的值,进行+1运算

3.save,把寄存器中的值写回到内存中

由于多线程调度顺序是不确定的。实际执行过程中,这俩线程的++操作实际的指令排序顺序有很多种可能~

可能是以下这个样子(仅仅一部分):我们想要的是第2 或者 第3种 

此处两个线程的指令的排序顺序有着很多种排列情况。

不同的排列顺序,结果是截然不同的。

 我们简要分析一下过程,取最理想的情况我们分析一下

再来分析一下,随机的一种情况. 

 

 

 此时我们发现,两个线程自增两次,最后结果是1.其中一次自增的结果,被另一次覆盖了。

 由于当前这两个线程调度顺序是无序的,有多少次是“顺序执行”,有多少次是“交错执行”是不知道的。

所以出现bug之后,得到的结果一定是<=10w。

结果是一定>=5w吗?

完全有可能小于5w,只是概率会小一些。

 

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

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

相关文章

【项目实训】ATM自助取款系统

文章目录 1. 课程设计目的2. 课程设计任务与要求3. 课程设计说明书3.1 需求分析3.1.1 功能分析3.1.2 性能要求分析 3.2 概要设计3.2.1 功能模块图 3.3 详细设计3.3.1 实体类的设计3.3.2 实现数据库处理 3.4 主要程序功能流程图 4. 课程设计成果4.1 完整代码4.2 运行结果4.2.1 精…

最常用的开源免费自动化测试工具整理汇总 ,总有一款适合你

目录 1、Selenium 2、JMeter 3、Appium 4、Soapui 5、Postman 6、Robot Framework 7、Monkey 8、GT 9、Appscan 10、Jenkins 1、Selenium 官网&#xff1a; WebUI自动化测试 Selenium是一个用于Web应用程序测试的工具&#xff0c;Selenium已经成为Web自动化测试工程…

SpringCloud源码探析(六)-消息队列RabbitMQ

1.概述 RabbitMQ是一个开源的消息代理和队列服务器&#xff0c;它是基于Erlang语言开发&#xff0c;并且是基于AMQP协议的。由于Erlang语言最初使用与交换机领域架构&#xff0c;因此使得RabbitMQ在Broker之间的数据交互具有良好的性能。AMQP(Advanced Message Queuing Protoc…

路径规划算法:基于多元宇宙算法的路径规划算法- 附代码

路径规划算法&#xff1a;基于多元宇宙优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于多元宇宙优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

【Unity Optimize】使用对象池(Object Pooling)优化项目

目录 1 对象池&#xff08;Object Pooling&#xff09;介绍2 实现对象池脚本3 使用对象池生成Cube4 效果展示5 Unity资源商店的对象池插件 1 对象池&#xff08;Object Pooling&#xff09;介绍 Unity中的对象池&#xff08;Object Pooling&#xff09;是一种用于提高游戏性能…

教程详解|如何在PICO眼镜中接入VR全景?

伴随着《万人狂欢泼水节》首场VR直播开启&#xff0c;PICO视频正式推出《跟着PICO去旅行》系列VR文旅直播节目&#xff0c;通过PICO眼镜结合VR技术向众多观众展现更多祖国的大好山河&#xff0c;通过PICO眼镜身临其境地感受云游世界的美妙。 经历了十余年的发展&#xff0c;VR…

esp32环境安装教程---arduino IDE

前言 &#xff08;1&#xff09;最近突然对esp32感兴趣了&#xff0c;源于逛油管的时候&#xff0c;总是看到很多大佬使用esp32cam进行网络图传&#xff0c;做摄像头。个人比较感兴趣&#xff0c;在环境安装过程遇到了很多坑&#xff0c;所以在此跟大家分享一下。 &#xff08;…

了解ChatGPT的最便捷有效方式是跟对人

毕业后&#xff0c;工作原因&#xff0c;我自己的CSND就没有更新过。现在更新一篇有关chatGPT的快速入门指南。 一、什么是chatGPT 2022年12月底&#xff0c;你问我这个问题&#xff0c;我还真得好好跟你解释一下。目前这个阶段的火热程度&#xff0c;这里不再啰嗦了。基于GPT…

AI时代的赚钱思路:23岁女网红如何利用AI技术年入4亿?

一、AI技术为网红赚钱创造新途径 23岁美国网红Caryn Marjorie&#xff08;卡琳玛乔丽&#xff09;正同时交往1000多个男朋友。 作为一个在Snapchat上坐拥180万粉丝的美女&#xff0c;她利用人工智能&#xff08;AI&#xff09;技术&#xff0c;打造了一个AI版本的自己&#x…

鲲鹏昇腾开发者峰会开幕 星辰天合发布新一代天合翔宇一体机

近日&#xff0c;主题为“创未来 享非凡”的鲲鹏昇腾开发者峰会 2023 在东莞松山湖开幕&#xff0c;此次大会旨在帮助开发者深入了解鲲鹏、昇腾全栈技术&#xff0c;加速行业数智化的技术、产品和解决方案创新。 作为鲲鹏生态重要合作伙伴&#xff0c;XSKY星辰天合获邀参加此次…

【利用AI让知识体系化】入门Koa框架

思维导图 文章目录 思维导图一、介绍Koa什么是KoaKoa的历史Koa的特点 二、基本使用安装KoaHello World中间件路由错误处理 三、进阶使用静态资源管理Session管理文件上传表单处理HTTPS支持 四、Koa中间件中间件的概念Koa的洋葱模型常用中间件的介绍自定义中间件的编写 五、异步…

这个水平来面试也敢要20K?还是3年经验的测试工程师....

起因 老板觉得现在公司部门里都是男的&#xff0c;缺少一点阴柔之气&#xff0c;想平衡一下&#xff0c;正巧当时互联网公司倒了一大批&#xff0c;大批简历投到公司&#xff0c;老板以为自己也是技术出身&#xff0c;就想着要招了一个三年工作经验的女测试员&#xff0c;要价…

ANR实战案例1 - Google广告导致ANR解决

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 文章目录 系列文章目录前言一、AdLoader$Builder广告构建ANR二、AdView布局动态创建案例总结 前言 一、AdLoa…

Linux 安装JDK详解

安装步骤 1. 从官网下载安装包保存到 /home/download 下面 2.下载后解压到指定目录&#xff0c;例如&#xff1a;/usr/java/jdk11 3. 解压压缩包 [rootlocalhost linux-x86-64]# cd /usr/java/jdk11 [rootlocalhost jdk11]# [rootlocalhost jdk11]# [rootlocalhost jdk11]…

【换模型更简单】如何用 Serverless 一键部署 Stable Diffusion?

作者&#xff1a;寒斜 本篇章是阿里云函数计算部署 Stable Diffusion 系列的第三篇&#xff0c;如果说第一篇是尝试使用云服务来解决用户本地部署 Stable Diffusion 的问题&#xff08;显卡成本&#xff0c;部署技术复杂&#xff09;&#xff0c;第二篇是面向技术同学解决云服…

Wijmo 2023 v1 Crack

改进了 FlexGrid&#xff0c;支持 React 18 严格模式和可访问性。 5月 15&#xff0c; 2023 - 10&#xff1a;51 新版本 特征 改进了对 React 18 的支持 - 添加了对 React 18 严格模式的支持&#xff0c;可帮助开发人员在开发过程中查找常见错误。辅助功能改进 - 以下是此版本中…

postman工具使用中,遇到的简单疑问

post请求和get请求有什么区别&#xff1f; GET请求和POST请求都是HTTP协议中的两种常见请求方式&#xff0c;主要区别如下&#xff1a; GET请求在请求URL的后面附带参数&#xff0c;而POST请求则将参数包含在请求体中。 GET请求的数据是以查询字符串的形式传递的&#xff0c;而…

JavaEE(系列4) -- 多线程(线程的状态)

目录 观察线程的所有状态 1. new状态 2. TERMINATED 状态 3. RUNNABLE 就绪状态,运行状态 4. TIMED_WAITNG 休眠状态 5. BLOCKED 表示等待锁出现的状态 6. WAITING 使用wait方法出现的状态 观察线程的所有状态 线程的状态是一个枚举类型 public class test2 {public static v…

【AI绘图 丨 Midjourney 系列教程二】— 初识超火的AI绘画神器Midjourney

今天起&#xff0c;由 Midjourney 打头阵&#xff0c;让我们开始共同探索一系列的 AI 领域革命性作品&#xff0c;包括 Midjourney、Stable Diffusion、ChatGPT 等等&#xff0c;学习这些新时代的魔法和它的咒语。 写在前面 官方文档是最好的入门课程。相较于市面上琳琅满目的…

git入门(必看)

git入门 git简介 文章目录 git入门git简介版本控制系统发展可以分为三个阶段&#xff1a; Git 的诞生Git 诞生的背景Linus 两周完成 GitGit 的发展壮大 git安装在 Windows 上安装在 macOS 上安装在 Linux 上安装 Git环境配置配置用户名和邮件地址检查配置Git 颜色配置Git忽略文…