JMM存在的必要性,你知道吗?

由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈空间),用于存储线程私有的数据,线程与主内存中的变量操作必须通过工作内存间接完成,主要过程是将变量从主内存拷贝的每个线程各自的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存,如果存在两个线程同时对一个主内存中的实例对象的变量进行操作就有可能诱发线程安全问题。

在这里插入图片描述
1、假设主内存中存在一个共享变量X,现在有A和B两条线程分别对该变量x=1进行操作,A和B线程各自在自己的工作内存中存在共享变量副本X.

2、假设现在A线程想要修改x的值 为2,而B线程却想要读取X的值,那么B线程读取到的值是A线程更新后的值2还是更新前的值1呢?答案是不确定,即B线程 有可能读取到A线程更新前的值1,也有可能读取到A 线程更新后的值2,这是因为工作内存是每个线程私有的数据区域,而线程A变量x时,首先是讲变量从主内存拷贝到A线程的工作内存中,然后对变量进行操作,操作完成 后再将变量X写回主内存中,而对于B线程也是类似,这样就有可能造成主内存与工作内存间数据存在不一致性问题。

3、假设A线程修改完成后正在将数据写回主内存,而B线程此时正在读取主内存,即将x=1拷贝到自己的工作呢次云中,这样B线程读取的值就是x=1,但如果A线程已将x=2写回主内存后,B线程才开始读取的话,那么此时B线程读取的就是x=2,但到底是哪种情况先发生呢?

史上最全的并发编程脑图:https://www.processon.com/view/5b1f1ad7e4b03f9d251c06e5#map

猜你喜欢

转载自blog.csdn.net/fd2025/article/details/108333630