Java内存模型(JMM)和happens-before原则是如何定义的?
- 内容介绍
- 文章标签
- 相关推荐
本文共计2365个文字,预计阅读时间需要10分钟。
我们知道Java程序是运行在JVM中的,而JVM则是构建在内存上的虚拟机。那么内存模型JMM具体是做什么的呢?
我们可以考虑一个简单的赋值问题:int a=100; JMM考察的就是在什么情况下读取变量a的值。
简单来说,JMM确保了在多线程环境下,对共享变量的读写操作的正确性和一致性。
我们知道java程序是运行在JVM中的,而JVM就是构建在内存上的虚拟机,那么内存模型JMM是做什么用的呢?
我们考虑一个简单的赋值问题:
int a=100;
JMM考虑的就是什么情况下读取变量a的线程可以看到值为100。看起来这是一个很简单的问题,赋值之后不就可以读到值了吗?
但是上面的只是我们源码的编写顺序,当把源码编译之后,在编译器中生成的指令的顺序跟源码的顺序并不是完全一致的。处理器可能采用乱序或者并行的方式来执行指令(在JVM中只要程序的最终执行结果和在严格串行环境中执行结果一致,这种重排序是允许的)。并且处理器还有本地缓存,当将结果存储在本地缓存中,其他线程是无法看到结果的。除此之外缓存提交到主内存的顺序也肯能会变化。
上面提到的种种可能都会导致在多线程环境中产生不同的结果。在多线程环境中,大部分时间多线程都是在执行各自的任务,只有在多个线程需要共享数据的时候,才需要协调线程之间的操作。
本文共计2365个文字,预计阅读时间需要10分钟。
我们知道Java程序是运行在JVM中的,而JVM则是构建在内存上的虚拟机。那么内存模型JMM具体是做什么的呢?
我们可以考虑一个简单的赋值问题:int a=100; JMM考察的就是在什么情况下读取变量a的值。
简单来说,JMM确保了在多线程环境下,对共享变量的读写操作的正确性和一致性。
我们知道java程序是运行在JVM中的,而JVM就是构建在内存上的虚拟机,那么内存模型JMM是做什么用的呢?
我们考虑一个简单的赋值问题:
int a=100;
JMM考虑的就是什么情况下读取变量a的线程可以看到值为100。看起来这是一个很简单的问题,赋值之后不就可以读到值了吗?
但是上面的只是我们源码的编写顺序,当把源码编译之后,在编译器中生成的指令的顺序跟源码的顺序并不是完全一致的。处理器可能采用乱序或者并行的方式来执行指令(在JVM中只要程序的最终执行结果和在严格串行环境中执行结果一致,这种重排序是允许的)。并且处理器还有本地缓存,当将结果存储在本地缓存中,其他线程是无法看到结果的。除此之外缓存提交到主内存的顺序也肯能会变化。
上面提到的种种可能都会导致在多线程环境中产生不同的结果。在多线程环境中,大部分时间多线程都是在执行各自的任务,只有在多个线程需要共享数据的时候,才需要协调线程之间的操作。

