了解线程安全
线程安全是多线程的重点和难点。
线程安全概念
线程安全:在多线程的各种随机调度顺序下,代码没有bug,都能够符合预期的方式来执行,此时认为线程安全
线程不安全:如果在多线程随机调度下代码出现bug,此时就认为是线程不安全。
当然,产生的**“bug”**算不算一个bug,取决于产品的需求文档
通过一段典型的代码来认识线程不安全

预期结果:count = 10000;
实际结果:
同时每次结果不同。
上诉问题是怎么出现的?
原因:
Count类里面的increas方法进行的count++操作,在计算机底层是三条指令在CPU上完成的!
1)把内存的数据读取到CPU寄存器中 load
2)把CPU的寄存器的值,进行 +1 add
3)把寄存器的值,写回到内存中 save
由于当前线程是两个线程修改一个变量,由于每次修改是3个步骤(不是原子的),由于线程之间的调度顺序是不确定。“
因此两个线程在真正执行这些操作的时候,就可能有多种执行的排列顺序。
正常情况: 两次累加,得到的结果应该是2

出现线程不安全情况:两次累加,得到的结果不是2


当然看图可能理解的不好,接来就选择一种情况来分析:

在形如这样的排列顺序下,此时多线程自增就会存在“线程安全问题”
整个线程 调度过程中,执行的顺序都是随机的;
由于在调度过程中,出现“串行执行”两种情况的次数和其他情况的次数不确定,因此得到的结果就是不确定的。(串行执行:正常情况那张图的两种方式就叫做串行执行)
线程不安全的五种原因:
1、抢占式执行(罪魁祸首)
多个线程调度的执行过程,是随机的
多线程编程难点:在编写多线程的代码的时候,就需要考虑到任意一种调度的情况下,都是能够运行出正确的结果的。
2、多个线程同时修改同一个变量
一个线程修改一个变量没事,多个线程读同一个变量,没事,多个线程修改不同变量,仍然没事。
这里涉及到一个面试题:String是不可变对象,这样设计有什么好处?
1、不可变对象本质是因为private隐藏了set系列方法
2、好处:线程安全是好处之一
3、修改操作不是原子的
解决线程安全问题,最常见的办法就是从原子性入手,把多个线程通过特殊手段,打包成一个原子操作。
像count++这种指令,本质上是三个CPU指令
load
add
save
CPU执行指令都是以“一个指令”为单位进行执行。
一个指令就相当于CPU上的**“最小单位”**不能说指令执行一般就把线程调度走了
但是修改操作,比如int a = 3;这样的赋值操作,就是单个CPU指令。这个时候就是更安全点。
(一个代码是否线程安全,判定是复杂的)
4、内存可见性
JVM代码优化带来的BUG
假设我们的代码很挫,目前有一个任务,是上级领导让我们加4个同事微信,并且问他们工作完成了没有;
假设我们写的代码是这样的,加一个同事,等待同事同意好友,回复以后,再去加下一个同事,问我们工作完成没有,挨个问这4个。
JVM看到我们这么搓的代码,上来就改成了一次性加4个同事好友,等待他们回复即可。
JVM的出发点是好的,但是有的时候优化过猛例如下面的代码:

执行的结果:

输入一个数字以后count应该是改变的,可是循环没有中断,仍然继续,这件事JVM优化的体现;
原因:JVM让认为读操作非常频繁,在t2线程没有输入时候,t1线程一直在进行读操作,但是t1没有任何改变,JVM就认为重复在内存中读是冗余的,直接从已经读过的缓存中拿。
5、指令重排序(也是由JVM优化引起)
具体在解决线程安全时候讲解
相关文章:
了解线程安全
线程安全是多线程的重点和难点。 线程安全概念 线程安全:在多线程的各种随机调度顺序下,代码没有bug,都能够符合预期的方式来执行,此时认为线程安全 线程不安全:如果在多线程随机调度下代码出现bug,此时…...
【git】git版本控制
目录 1.在合适的位置打开bush,创建仓库 2.检查:跳转到当前文件夹,显示当前文件夹的相对路径 3.初始化 4.创建一个文本文件readme.txt 5.手动向readme文件中添加一些内容 6.把文件添加到暂存区 7.把文件提交到git仓库 8.手动修改readme.txt文件 9.查看当前…...
模电学习7. 三极管特性曲线与静态工作点
模电学习7. 三极管特性曲线与静态工作点一、三极管的伏安特性曲线1. 三极管的伏安特性曲线2. 三极管的静态工作点二、合适的静态工作点选择1. 合适静态工作点条件2. 静态工作点的确定三、使用立创EDA仿真查看静态工作点1. 搭建如下图所示测试电路2. 点击菜单仿真、仿真设置3. 运…...
LeetCode题解:633. 平方数之和,双指针,JavaScript,详细注释
原题链接: https://leetcode.cn/problems/sum-of-square-numbers/ 解题思路: a和b一定是000到c\sqrt cc之间的某个值。将a的初始值设为0。b的初始值设为c\sqrt cc,b必须为整数。a和b向中间逼近,查找满足条件的值。由于a和b是…...
Keil编译头文件iec_std_functions.h错误解决
Keil 编译IEC61131-3库,头文件,大量出现以下错误; cast to type ? is not allowed compiling resource1.c... ..\PLC\rts\matiec\lib\C\iec_std_functions.h(192): error: #119: cast to type "TIME" is not allowed…...
2022 赣育杯 CTF --- Crypto Lost_N wp
文章目录前言题目解题过程解题代码前言 这是去年江西省赛一道有点小坑的密码题,当时没做出来,今天回想起来重新做一下并且记录一下。 题目 Lost_N.py import gmpy2 from Crypto.Util.number import * # part1 flag bSangFor{} d getPrime(435) cou…...
【趋势分析方法三】MATLAB代码实现TFPW-MK检验
目前水文时间序列趋势分析的方法很多,主要分为参数检验和非参数检验两大类: 参数检验中常用的有线性回归法、滑动平均法、累积距平法等非参数检验则主要包括Mann-Kendal(MK)法和 Spearman 秩次相关法等 虽然从理论上讲ÿ…...
一文学会 Spring 整合 MyBatis
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
ElasticSearch - 文档 | 索引文档 | 检索文档 | 创建索引并指明映射
文章目录1. ElasticSearch是面向文档的2. 索引员工文档3. 检索员工文档4. 映射1. ElasticSearch是面向文档的 在应用程序中对象很少只是一个简单的键和值的列表。通常,它们拥有更复杂的数据结构,可能包括日期、地理信息、其他对象或者数组等。 Elastic…...
SQL中的DML、DDL、DCL分别是什么意思
SQL命令的分类 数据定义语言 DDL(DataDefinition Language) 是 SQL 语言集中负责数据结构定义。 DDL 的核心指令是CREATE、ALTER、DROP。 操作的对象包括:库、表、视图、索引等。 如:CREATE TABLE ; ALTER INDEX; DROP VIEW; 数据…...
kubeasz部署k8s高可用集群
前言:如无特殊说明,所有操作都用root账号在所有节点执行。 说明:kubeasz是一款国产开源的k8s部署软件,采用ansible role的部署方式,部署k8s二进制集群。熟悉ansible role的用该软件部署k8s方便快捷。 一、机器 deplo…...
2022年工程机械出口专题研究【重工】
文章目录2022年工程机械出口专题研究1、中国是全球工程机械第一大市场,竞争力逐步提升2、工程机械出口高增,市场分布趋于多元,企业营收获益3、海外市场高速增长原因为何?4、海外市场增长动能预测附件:2022年工程机械出…...
[python入门(51)] - python时间日期格式time和datetime
目录 ❤ 预备知识 ❤ UTC time Coordinated Universal Time ❤ epoch time ❤ timestamp(时间戳) ❤ stamptime时间戳 ❤ struct_time时间元组 ❤ format time 格式化时间 ❤ time模块编辑 ❤ 获取当前时间的方法 ❤ 当传入默认参…...
别担心ChatGPT距离替代程序猿还有距离
经过多天对chat-GPT在工作的使用,我得出一个结论,它睁眼瞎说就算了,它还积极认错,绝不改正,错误答案极具误导性,啥也不说了,请看图。 经过N次较量它固执的认为 0011 1101 0110 0101在最高位是左…...
SpringBoot项目打包部署到阿里云服务器、通过Maven插件制作Docker镜像、部署项目容器、配置生产环境
制作通用模块jar包 通用模块不是运行的,而且要被其他模块引入的,所以该模块不能采用springboot打包方式制作jar包,否则其他模块无法引入通用模块。 1、修改通用模块,设置模块为非Springboot项目 <?xml version"1.0&qu…...
OpenGov的首个方案已上线Moonriver
随着公投128的通过,作为Runtime 2100的一部分,Moonbeam在Moonriver上推出了OpenGov。Moonbeam上的OpenGov部署将从Moonriver开始,以获得社区反馈。未来将举行公投,让社区来决定OpenGov如何发展并转移至Moonbeam。 Moonriver上的O…...
(三十一)大白话MySQL如果事务执行到一半要回滚怎么办?再探undo log回滚日志原理
之前我们已经给大家深入讲解了在执行增删改操作时候的redo log的重做日志原理,其实说白了,就是你对buffer pool里的缓存页执行增删改操作的时候,必须要写对应的redo log记录下来你做了哪些修改 如下图所示: 这样万一要是你提交事…...
机器学习-基于KNN及其改进的汉字图像识别系统
一、简介和环境准备 knn一般指邻近算法。 邻近算法,或者说K最邻近(KNN,K-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。而lmknn是局部均值k最近邻分类算法。 本次实验环境需要用的是Google Colab和Google Dr…...
Zebec生态持续深度布局,ZBC通证月内翻倍或只是开始
“Zebec生态近日利好不断,除了推出了回购计划外, Nautilus Chain 、Zebec Labs等也即将面向市场,都将为ZBC通证深度赋能。而ZBC通证涨幅月内突破100%,或许只是开始。”近日,流支付生态Zebec生态通证ZBC迎来了大涨&…...
Leetcode.1238 循环码排列
题目链接 Leetcode.1238 循环码排列 Rating : 1775 题目描述 给你两个整数 n和 start。你的任务是返回任意 (0,1,2,,...,2^n-1)的排列 p,并且满足: p[0] startp[i]和 p[i1]的二进制表示形式只有一位不同p[0]和 p[2^n -1]的二进制表示形式也…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...

