Java并发编程 --- 线程安全
为什么会有线程安全问题?
为什么会存在线程安全问题呢?那我们先来探究一下JMM(Java内存模型)
线程与JMM
每个线程都有自己的工作内存,它会存储主内存中变量的Copy值,再对变量进行操作的时候,也是操作工作内存中变量的Copy值。
当线程Dead(生命周期结束)时,才会将自己工作内存中的数据同步到主内存中。(同步不及时)
代码非原子
如i++操作,看着只有一条指令,但其实蕴含了三个操作,即:
1、先获取i的值。
2、将1操作获取到的值进行加1。
3、并将计算得到的值赋给i。
所以代码非原子性操作,也是产生线程安全的原因之一。
如有两个线程,分别对共享变量k进行++操作,然而可能因为操作的非原子性,导致他们在第一步获取值时的结果是相同的,造成后续k比预期少了1.
总结
造成线程安全问题的原因如下:
1、线程对变量的操作是在工作内存中操作且修改后同步到主内存不及时,导致其他线程感知不到发生了修改。
2、多线程下对资源的竞争。
3、操作的非原子性。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战