为什么会有线程安全问题?
为什么会存在线程安全问题呢?那我们先来探究一下JMM(Java内存模型)
线程与JMM
每个线程都有自己的工作内存,它会存储主内存中变量的Copy值,再对变量进行操作的时候,也是操作工作内存中变量的Copy值。
当线程Dead(生命周期结束)时,才会将自己工作内存中的数据同步到主内存中。(同步不及时)
代码非原子
如i++操作,看着只有一条指令,但其实蕴含了三个操作,即:
1、先获取i的值。
2、将1操作获取到的值进行加1。
3、并将计算得到的值赋给i。
所以代码非原子性操作,也是产生线程安全的原因之一。
如有两个线程,分别对共享变量k进行++操作,然而可能因为操作的非原子性,导致他们在第一步获取值时的结果是相同的,造成后续k比预期少了1.
总结
造成线程安全问题的原因如下:
1、线程对变量的操作是在工作内存中操作且修改后同步到主内存不及时,导致其他线程感知不到发生了修改。
2、多线程下对资源的竞争。
3、操作的非原子性。
标签:Java,变量,---,安全,线程,内存,操作 From: https://www.cnblogs.com/ayu0v0/p/18532112