Java内存模型(JMM)和happens-before原则是如何定义的?

2026-05-26 09:050阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计2365个文字,预计阅读时间需要10分钟。

Java内存模型(JMM)和happens-before原则是如何定义的?

我们知道Java程序是运行在JVM中的,而JVM则是构建在内存上的虚拟机。那么内存模型JMM具体是做什么的呢?

我们可以考虑一个简单的赋值问题:int a=100; JMM考察的就是在什么情况下读取变量a的值。

简单来说,JMM确保了在多线程环境下,对共享变量的读写操作的正确性和一致性。

我们知道java程序是运行在JVM中的,而JVM就是构建在内存上的虚拟机,那么内存模型JMM是做什么用的呢?

我们考虑一个简单的赋值问题:

int a=100;

JMM考虑的就是什么情况下读取变量a的线程可以看到值为100。看起来这是一个很简单的问题,赋值之后不就可以读到值了吗?

Java内存模型(JMM)和happens-before原则是如何定义的?

但是上面的只是我们源码的编写顺序,当把源码编译之后,在编译器中生成的指令的顺序跟源码的顺序并不是完全一致的。处理器可能采用乱序或者并行的方式来执行指令(在JVM中只要程序的最终执行结果和在严格串行环境中执行结果一致,这种重排序是允许的)。并且处理器还有本地缓存,当将结果存储在本地缓存中,其他线程是无法看到结果的。除此之外缓存提交到主内存的顺序也肯能会变化。

上面提到的种种可能都会导致在多线程环境中产生不同的结果。在多线程环境中,大部分时间多线程都是在执行各自的任务,只有在多个线程需要共享数据的时候,才需要协调线程之间的操作。

阅读全文

本文共计2365个文字,预计阅读时间需要10分钟。

Java内存模型(JMM)和happens-before原则是如何定义的?

我们知道Java程序是运行在JVM中的,而JVM则是构建在内存上的虚拟机。那么内存模型JMM具体是做什么的呢?

我们可以考虑一个简单的赋值问题:int a=100; JMM考察的就是在什么情况下读取变量a的值。

简单来说,JMM确保了在多线程环境下,对共享变量的读写操作的正确性和一致性。

我们知道java程序是运行在JVM中的,而JVM就是构建在内存上的虚拟机,那么内存模型JMM是做什么用的呢?

我们考虑一个简单的赋值问题:

int a=100;

JMM考虑的就是什么情况下读取变量a的线程可以看到值为100。看起来这是一个很简单的问题,赋值之后不就可以读到值了吗?

Java内存模型(JMM)和happens-before原则是如何定义的?

但是上面的只是我们源码的编写顺序,当把源码编译之后,在编译器中生成的指令的顺序跟源码的顺序并不是完全一致的。处理器可能采用乱序或者并行的方式来执行指令(在JVM中只要程序的最终执行结果和在严格串行环境中执行结果一致,这种重排序是允许的)。并且处理器还有本地缓存,当将结果存储在本地缓存中,其他线程是无法看到结果的。除此之外缓存提交到主内存的顺序也肯能会变化。

上面提到的种种可能都会导致在多线程环境中产生不同的结果。在多线程环境中,大部分时间多线程都是在执行各自的任务,只有在多个线程需要共享数据的时候,才需要协调线程之间的操作。

阅读全文