Java内存模型

概念        

Java内存模型(Java Memory Model简称JMM)是来屏蔽掉各种硬件和操作系统的内存访问差异,使用统一的一种内存模型达到一致的访问效果。Java内存的主要目标是定义程序中各个变量的访问规则,就是在虚拟机中将变量存储到内存和从内存中取出变量,变量不含局部变量,只含线程中共享变量(线程共享的区域指JVM内存模型中的堆、方法区,下图为JVM内存结构方便回忆巩固)。     Java内存模型_第1张图片

注意:Java内存模型是跟并发有关的,并且它是虚拟机定义的一种抽象模型

内存模型

Java内存模型_第2张图片

Java内存模型定义了以下几个关键概念:

主内存(Main Memory)

        所有线程共享的共享内存区域,主要用于存储对象的实例。

工作内存(Working Memory)

        每个线程都有自己的工作内存,用于存储线程私有的变量和缓存。

内存间交互操作

        Java内存模型定义了一组操作,如read、load、use、assign、store和write,用于描述主内存和工作内存之间的交互行为。

顺序一致性(Sequential Consistency)

        顺序一致性是指程序中的指令执行顺序与它们在源代码中的顺序一致。

锁定和同步

        Java内存模型通过synchronized关键字和volatile关键字提供了一种机制来控制线程之间的同步。

happens-before关系

        如果一个操作A先于操作B发生,则A happens-before B。如果A happens-before B,则B能够看到A的可见性结果。

JMM保证

        1、对于基本数据类型读写保证原子性(long、double除外)

        2、synchronized保证可见性和原子性

        3、volatile保证有序性(防止指令重排序)和可见性(volatile其实就是直接操作主存,主存上变量当然是共享的)

        4、happens-before保证有序性

              1)happens-before含义:两项操作之间的偏序关系,主要用于规定线程修改的变量在何时对其他线程可见。如果一个操作A happens-before另一个操作B,那么A的操作结果将对B可见,并且A的操作顺序排在B之前。

                2)Happens-Before原则包括以下规则:

                        a.程序顺序规则:在一个线程中的每个操作,happens-before在该线程中的任意后续操作。这意味着如果一个操作出现在一个程序的某个执行顺序中,那么这个操作的执行顺序会在所有后续操作的执行顺序之前。

                        b.锁规则:一个解锁操作happens-before后续的加锁操作。这确保了当一个线程释放锁后,后续获取该锁的线程可以获取到这个锁。

                        c.volatile变量规则:对一个volatile变量的写操作happens-before后续对这个变量的读操作。这确保了当一个线程写入一个volatile变量后,后续读取该变量的线程能够立即看到最新的值。

                        d.传递性:如果操作A happens-before操作B,操作B happens-before操作C,那么操作A happens-before操作C。

Happens-Before原则是判断数据是否存在竞争、线程是否安全的主要依据。在并发编程中,如果两个操作之间存在happens-before关系,那么前一个操作的结果对后一个操作可见,并且前一个操作的执行顺序排在后一个操作之前。这样可以确保并发程序的一致性和正确性。

你可能感兴趣的:(Java进阶,java)