Java并发编程 --- 线程安全

为什么会有线程安全问题?

为什么会存在线程安全问题呢?那我们先来探究一下JMM(Java内存模型)

image.png

线程与JMM

每个线程都有自己的工作内存,它会存储主内存中变量的Copy值,再对变量进行操作的时候,也是操作工作内存中变量的Copy值

当线程Dead(生命周期结束)时,才会将自己工作内存中的数据同步到主内存中。(同步不及时)

代码非原子

如i++操作,看着只有一条指令,但其实蕴含了三个操作,即:

1、先获取i的值。
2、将1操作获取到的值进行加1。
3、并将计算得到的值赋给i。

所以代码非原子性操作,也是产生线程安全的原因之一。

如有两个线程,分别对共享变量k进行++操作,然而可能因为操作的非原子性,导致他们在第一步获取值时的结果是相同的,造成后续k比预期少了1.

总结

造成线程安全问题的原因如下:

1、线程对变量的操作是在工作内存中操作且修改后同步到主内存不及时,导致其他线程感知不到发生了修改。

2、多线程下对资源的竞争。

3、操作的非原子性。

posted @   ayu0v0  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示