[JAVAEE] 线程安全问题
目录
一. 什么是线程安全
二. 线程安全问题产生的原因
三. 线程安全问题的解决
3.1 解决修改操作不是原子性的问题 => 加锁
a. 什么是锁
b. 没有加锁时
c. 加锁时
d. 死锁
e. 避免死锁
3.2 解决内存可见性的问题 => volatile关键字 (易变的, 善变的)
a. 不加volatile关键字
b. 加volatile关键字
一. 什么是线程安全
在多线程并发执行的过程中, 出现 bug, 称为线程不安全. 反之则线程安全.
二. 线程安全问题产生的原因
1. 操作系统对于线程的调度是随机的, 抢占式的[根本原因].
2. 多个线程修改同一个变量.
3. 修改操作不是原子的. => 解决: 锁
4. 内存可见性. => 解决: volatile(adj. 善变的. 易变的)关键字
5. 执行重排序. => 解决: wait() 与 notify() 等待 与 通知
三. 线程安全问题的解决
3.1 解决修改操作不是原子性的问题 => 加锁
a. 什么是锁

synchronized修饰普通方法, 是对this加锁.
synchronized修饰静态方法, 是对类对象加锁.
b. 没有加锁时
没有对count++操作进行加锁时, count的结果总是 <= 100000, 这是因为(线程调度是随机的, 抢占式的 + count++操作不是原子的)
c. 加锁时
对count++操作进行加锁后, count++操作可以认为变成原子的了, 这时, count的最终结果就符合预期.
d. 死锁
构成死锁的场景:
1. 一个线程, 一把锁 (但是, java中锁具有可重入特性, 此种情况下, 并不会构成死锁)
2. 两个线程, 两把锁
3. n个线程, m把锁
构成死锁的四个必要条件:
1. 锁是互斥的. (线程1获取了锁1, 这时线程2想要再获取锁1 就要阻塞等待)
2. 锁是不可抢占的
3. 请求和保持. (线程1获取了锁1, 线程2获取了锁2, 此时, 线程1想要再获取锁2, 线程2想要再获取锁1, 这时就会构成死锁, 线程阻塞) => 解决: 一定情况下, 避免嵌套
4. 循环等待. => 解决: 约定加锁的顺序.
e. 避免死锁
想要避免死锁, 就要解决 3 或者 4 这两个必要条件.
解决3. (避免嵌套)
解决4.(按照一定的顺序进行加锁)
3.2 解决内存可见性的问题 => volatile关键字 (易变的, 善变的)
a. 不加volatile关键字
可以观察到, t1线程并没有因为t2线程输入val的值不是0而结束, 反而一直在RUNNABLE(运行中). 这是因为, jvm对代码进行了优化, jvm检测到val的值一直不发生改变, 为了提高效率, 就把val转移到了寄存器中, 此时t2线程输入val还在和内存进行交互, 并不会改变val的值.
b. 加volatile关键字
加上volatile关键字, 表示val的值是易变的, 用户随时可能会修改, 此时, jvm就不会对val的操作进行优化, val一直存在于内存中.
未完成...
相关文章:
[JAVAEE] 线程安全问题
目录 一. 什么是线程安全 二. 线程安全问题产生的原因 三. 线程安全问题的解决 3.1 解决修改操作不是原子性的问题 > 加锁 a. 什么是锁 b. 没有加锁时 c. 加锁时 d. 死锁 e. 避免死锁 3.2 解决内存可见性的问题 > volatile关键字 (易变的, 善变的) a. 不加…...
k8s 集群给用户生成 kubeconfig 文件
在 k8s 集群的 RBAC 里有用到用户、组的概念,但是它又不直接管理这些资源,而是通过外部身份验证机制(Authentication Mechanisms)来管理和定义的,比如证书进行签名时,将其配置为 Subject: O system:master…...
(八)Proteus仿真STM32单片机GPIO驱动数码管
1,参考上篇,将LED点阵屏更换成数码管如下图 2,修改驱动函数,数组seg[14]前10个是0-9数字的编码,后四个是空格,点,横线,下划线 char seg_decode(char num)//数字解码 {const char se…...
Python进阶知识1
Python函数 定义一个函数 1.什么是函数:函数是可以重复执行的语句块,可以重复调用 2.作用:用于封装语句块, 提高代码的重用性。 函数是面向过程编程的最小单位 def 语句 1.作用:用来定义( 创建)函数 2…...
单片机设计|基于STM32实现具有室内定位功能的智能手环的设计
作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,…...
计算机网络——运输层(可靠传输、超时重传、选择确认、流量控制和拥塞控制、TCP连接和释放)
TCP可靠传输的实现 我们假定数据传输只在一个方向进行,即A发送数据,B给出确认。这样的好处是使讨论限于两个窗口,即发送方A的发送窗口和接收方B的接收窗口。 以字节为单位滑动窗口 发送方构造窗口 窗口前沿和后沿的移动情况 描述发送窗口的状…...
Web安全实践
前言 安全无小事,成败在细节,网络有风险,灾难弹指间。 安全一般情况下看不见,在你周围漂浮着,显现出来后,往往会刻骨铭心。正因为安全看不见,所以往往不受重视,因为感知到的概率真…...
【算法篇】动态规划类(2)——01背包+完全背包(笔记)
目录 一、理论基础 1. 问题类型 2. 01背包问题 3. 完全背包问题 4. 解题步骤 (1)确定dp数组(dp table)以及下标的含义。 (2)确定递推公式。 (3)dp数组如何初始化。 &#x…...
基于SpringBoot的“社区医院管理服务系统”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“社区医院管理服务系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统首页界面图 用户注册界面图 医生界面…...
二进制漏洞利用 | 整数溢出探究
什么是整数溢出? 整数溢出是指当算术运算的结果超出用于存储该结果的数据类型的容量时发生的现象。简单来说,就是当一个数值变得过大(对于有符号整数来说,也可能是过小),无法被正常存储,从而导…...
10种经典的螺栓防松设计
螺栓防松在机械设计中至关重要,不同方式的螺栓防松有哪些特点一起来看一下。 01双螺母 双螺母防松也称对顶螺母防松,当两个对顶螺母拧紧后,两个对顶的螺母之间始终存在相互作用的压力,两螺母中有任何一个要转动都需要克服旋合螺纹…...
开放式蓝牙耳机哪个品牌好用?开放式耳机排行榜测评!
开放式耳机,因其特殊的不入耳佩戴模式,让使用者在享受音乐或者进行通话的过程中,依然可以对外界声音保持敏感。在户外运动场景下,这种特性优势尽显,既保证了耳机佩戴的稳定和舒适,又提高了运动的安全性。为…...
新能源行业必会基础知识---电力现货问答---第5问---何为电力中长期市场?与电力现货市场之间有何关系?国内试点地区如何衔接?国外有哪些经验值得借鉴?
新能源行业必会基础知识-----电力现货问答-----主目录-----持续更新https://blog.csdn.net/grd_java/article/details/142909208 虽然这本书已经出来有几年了,现货市场已经产生了一定变化,但是原理还是相通的。还是推荐大家买来这本书进行阅读观看&#…...
如何将数据从 AWS S3 导入到 Elastic Cloud - 第 2 部分:Elastic Agent
作者:来自 Elastic Hemendra Singh Lodhi 了解将数据从 AWS S3 提取到 Elastic Cloud 的不同选项。 这是多部分博客系列的第二部分,探讨了将数据从 AWS S3 提取到 Elastic Cloud 的不同选项。 在本博客中,我们将了解如何使用 Elastic Agent…...
DTL698电表数据 转 profinet IO协议项目案例
目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 配置VFBOX网关 2 5 用PROFINET IO协议转发数据 4 6 其他说明 6 7 案例总结 7 1 案例说明 设置网关采集DLT698电表数据数据把采集的数据转成profinet IO协议转发给其他系统。 2 VFBOX网关工作原理 VFBOX网关是协议转…...
CSS @规则(At-rules)系列详解___@font-face规则使用方法
CSS 规则(At-rules)系列详解 ___font-face规则使用方法 本文目录: 零、时光宝盒 一、CSSfont-face规则定义和用法 二、font-face语法 三、font-face使用方法例子 3.1、指定一种字体 3.2、font-face 里添加文本的描述符 3.3、设置多个 font-face 规则。 3.4…...
如何通过CDN优化网站服务器访问速度?
CDN,即内容分发网络(Content Delivery Network),在现代互联网中起着重要作用。它可以显著提升网站服务器的访问速度。以下是CDN在加速网站访问方面的主要优势及其工作原理。 1. 全球分布的服务器节点 CDN通过在全球范围内布设多个…...
JAVA学习-练习试用Java实现“自定义函数之字符反转”
问题: 写一函数,使输入的一个字符串按反序存放,在主函数中输入并输出反序后的字符串(不包含空格)。 示例 :输入一行字符123456abcdef,输出逆序后的字符串fedcba654321。 解答思路: …...
大衍数列——考研408考试科目之数据算法——未来之窗学习通
一、大衍数列 中国古代文献中,曾记载过“大衍数列”, 主要用于解释中国传统文化中的太极衍生原理。 它的前几项是:0、2、4、8、12、18、24、32、40、50 … 其规律是:对偶数项,是序号平方再除2,奇数项,是…...
JVM(HotSpot):直接内存及其使用建议
文章目录 一、什么是直接内存?二、特点三、使用案例四、直接内存的管理 一、什么是直接内存? Direct Memory:系统内存 普通IO,运行原理图 磁盘到系统内存,系统内存到jvm内存。 NIO,运行原理图 划分了一块…...
OpenPLC Editor:重塑工业自动化编程的开源方案
OpenPLC Editor:重塑工业自动化编程的开源方案 【免费下载链接】OpenPLC_Editor 项目地址: https://gitcode.com/gh_mirrors/ope/OpenPLC_Editor 在工业自动化领域,PLC(可编程逻辑控制器)编程长期被商业软件垄断ÿ…...
嵌入式开发:裸机到OS的技术挑战与优化
嵌入式开发从裸机到操作系统的技术挑战分析1. 系统性能需求变化1.1 CPU运行速度要求嵌入式系统引入操作系统后,CPU需要承担额外的调度开销。实时控制系统通常需要1ms甚至更短的tick间隔来保证控制精度,这进一步增加了CPU的负担。现代32位微控制器的性能提…...
别再只用总基尼系数了!用Python实现Dagum分解,看清区域差距的‘里子’
用Python拆解经济差距:Dagum基尼系数分解实战指南 当一份区域经济报告只给出一个总的基尼系数时,就像医生只告诉你"体温偏高"却不说明是哪个器官发炎——数据研究者常陷入这种诊断困境。传统基尼系数虽能反映整体不平等程度,却无法…...
个人知识管理:用OpenClaw+nanobot构建第二大脑
个人知识管理:用OpenClawnanobot构建第二大脑 1. 为什么需要第二大脑? 作为一名技术写作者,我每天要处理大量信息:技术文档、行业报告、代码片段、会议记录...这些碎片化知识散落在浏览器书签、微信收藏、本地文档里,…...
微信小程序onLaunch异步问题实战:如何确保Page的onLoad在onLaunch完成后执行?
微信小程序异步初始化难题:5种方案确保onLaunch与onLoad的执行顺序 微信小程序的启动流程看似简单,却隐藏着一个让不少开发者踩坑的异步陷阱。当你在app.js的onLaunch中进行网络请求或异步操作时,页面层级的onLoad可能已经迫不及待地开始执行…...
自动化数据标注:OpenClaw+Qwen3.5-9B加速AI模型训练
自动化数据标注:OpenClawQwen3.5-9B加速AI模型训练 1. 数据标注的痛点与自动化机遇 作为一名长期奋战在机器学习一线的开发者,我深知数据标注环节的折磨。去年参与一个图像分类项目时,团队花费了整整三周时间手工标注5万张图片,…...
Linux下adb调试小米手机报错Exception的5种解决方法(附详细排查步骤)
Linux下adb调试小米手机报错Exception的5种深度解决方案 最近在Linux环境下用adb调试小米手机时,不少开发者遇到了Exception occurred while executing put这个让人头疼的错误。作为一名常年与adb打交道的开发者,我深知这种问题一旦出现,轻则…...
移动开发终极指南:如何利用stb库在Android和iOS平台实现高性能图像处理
移动开发终极指南:如何利用stb库在Android和iOS平台实现高性能图像处理 【免费下载链接】stb stb single-file public domain libraries for C/C 项目地址: https://gitcode.com/GitHub_Trending/st/stb 在移动应用开发中,图像处理是提升用户体验…...
电机控制进阶:从增量式与位置式PID到现代复合控制策略
1. PID控制的前世今生:从工业革命到智能时代 第一次接触PID控制器时,我被这个诞生于上世纪30年代的"古董级"算法震惊了。当时正在调试一台伺服电机,系统总是出现超调和振荡。导师递给我一张写着三个参数的纸条:"试…...
别再只盯着代码了!手把手教你读懂Cartographer的PGM和YAML地图文件(附Notepad++实操)
从二进制到坐标系:Cartographer地图文件深度解析与实战调参指南 当你第一次打开Cartographer生成的.pgm和.yaml文件时,是否感觉像在解读某种外星密码?那些数字和参数背后,藏着机器人如何理解世界的秘密。本文将带你像侦探一样拆解…...
















