理解JMM模型的原子性、可见性与有序性

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wueryan/article/details/87859292

我们需要去了解JMM存在的意义,作为一组规则,我们不能别人要我们有,我们就得有这个规则,我们得尝试去理解JMM作为一组规则存在的意义。

我们在之前已经了了解到JVM实际运行程序的时以线程为实体,在创建线程的时候,JVM虚拟机会尝试给他们创建栈空间,即工作空间,来作为线程本身私有数据的存储空间。线程从主存取出数据后进行更新,然后重新写入主存中。主存的数据是实体,单一线程拿到的实际是数据的镜像。这里会存在多线程向主存获取同一份数据后,同时进行操作,但是实际上线程拿到的数据已经不是最新的了,导致写入主存的结果与预期并不符合。

这也就是我们常说的线程安全问题。

为了解决上面的问题,JVM就定义了一组规则,尝试去解决这个问题。

这里涉及到三个规则需要了解一下的。

1、原子性

原子性:一个操作不可分割的,不可分离的。举个简单例子,对于变量x,进行加1,然后取到值,这一个过程尽管简单,但是却不具备原子性,因为我们要先读取x,之后进行计算,然后重新写入,其实是几个步骤。如果仅仅对x进行赋值,那么则可以认为是原子的。

对于基本数据类型,他们的读取行为通常是原子操作,但是对于long和double是64位,则在线程操作过程中,不一定是原子操作,线程A在获取数据时,可能只限操作前32位,轮到线程B操作时,则可能会读到后面的32位。

2、可见性

3、有序性

猜你喜欢

转载自blog.csdn.net/wueryan/article/details/87859292