返回

Java内存模型与硬件内存模型的渊源:揭秘两者之间的关联

后端

Java内存模型与硬件内存模型的渊源

Java内存模型(Java Memory Model,简称JMM)是Java虚拟机(Java Virtual Machine,简称JVM)中用于定义多线程并发执行时内存可见性和一致性的规则和机制。JMM规定了线程如何访问和修改共享内存,以及如何保证内存操作的顺序和原子性。JMM的设计灵感和基础来源于硬件内存模型(Hardware Memory Model,简称HMM)。

HMM是计算机硬件中用于定义内存访问和一致性的规则和机制。HMM由计算机体系结构决定,不同的计算机体系结构有不同的HMM。HMM规定了处理器如何访问和修改内存,以及如何保证内存操作的顺序和原子性。

JMM是建立在HMM之上的。JMM继承了HMM的大部分规则和机制,并在其基础上增加了一些额外的规则和机制来适应Java语言的特点和需求。例如,JMM增加了happens-before关系的概念,来保证多线程程序中内存操作的顺序和可见性。

JMM如何建立在HMM之上

JMM是建立在HMM之上的。JMM继承了HMM的大部分规则和机制,并在其基础上增加了一些额外的规则和机制来适应Java语言的特点和需求。

JMM继承了HMM的以下规则和机制:

  • 原子性: 原子的意思是一个操作要么全部执行,要么完全不执行。HMM保证处理器对内存的访问是原子的。JMM也继承了这一规则,并将其扩展到了Java语言的锁机制。当一个线程获得了一个锁,它就可以独占地访问被锁保护的共享内存。
  • 顺序一致性: 顺序一致性的意思是,处理器对内存的访问是按照程序执行的顺序进行的。HMM保证处理器对内存的访问是顺序一致性的。JMM也继承了这一规则,并将其扩展到了Java语言的happens-before关系。happens-before关系是一种特殊的偏序关系,它保证了多线程程序中内存操作的顺序和可见性。
  • 内存可见性: 内存可见性的意思是,一个线程对共享内存的修改对其他线程是可见的。HMM保证处理器对内存的访问是内存可见性的。JMM也继承了这一规则,并将其扩展到了Java语言的volatile变量和synchronized。volatile变量是一种特殊类型的变量,它可以保证对它的修改对其他线程是可见的。synchronized关键字可以用来同步多线程程序中的内存访问,并保证对共享内存的修改对其他线程是可见的。

JMM增加了以下额外的规则和机制来适应Java语言的特点和需求:

  • happens-before关系: happens-before关系是一种特殊的偏序关系,它保证了多线程程序中内存操作的顺序和可见性。happens-before关系有以下几种:
    • 程序顺序: 在一个线程中,按照程序执行的顺序,后面的内存操作happens-before前面的内存操作。
    • 管程锁: 如果一个线程获得了某个管程锁,那么该线程对该管程锁的解锁操作happens-before其他线程对该管程锁的加锁操作。
    • volatile变量: 对volatile变量的写操作happens-before对volatile变量的读操作。
    • synchronized 对一个对象的synchronized方法或synchronized块的调用happens-before对该对象的其他synchronized方法或synchronized块的调用。
  • volatile变量: volatile变量是一种特殊类型的变量,它可以保证对它的修改对其他线程是可见的。volatile变量的实现依赖于底层的硬件支持。在一些计算机体系结构中,volatile变量的实现可能需要使用特殊的内存屏障指令。
  • synchronized关键字: synchronized关键字可以用来同步多线程程序中的内存访问,并保证对共享内存的修改对其他线程是可见的。synchronized关键字的实现依赖于底层的硬件支持。在一些计算机体系结构中,synchronized关键字的实现可能需要使用特殊的内存屏障指令。

结语

Java内存模型和硬件内存模型有着千丝万缕的联系。JMM是建立在HMM之上的,JMM继承了HMM的大部分规则和机制,并在其基础上增加了一些额外的规则和机制来适应Java语言的特点和需求。通过了解JMM和HMM之间的关联,我们可以更好地理解Java多线程编程的本质,并编写出健壮的多线程程序。