求问该如何理解 Java 内存模型中的 Program Order?

如何理解 Java 内存模型中的 Program Order?


至尊宝的传说
浏览 1132回答 3
3回答

慕少森

关于Program Order,对于每个线程,他只是一个语句的执行顺序集合定义,在这个集合里语句执行顺序能够保证正确性,即执行结果等于人为阅读代码时的执行结果(例如不管你按什么顺序执行1+1,始终等于2)。而Program Order的正确性保证了Intra-thread consistency.1、intra-thread semanticsIntra-thread semantics are the semantics for single-threaded programs, and allow the complete prediction of the behavior of a thread based on the values seen by read actions within the thread.单线程语义是内在一致的,这要求运行时环境(虚拟机或CPU)在单线程语境下,要至少提供以下保证:1. 对同一内存对象的交替读,写,是有序的。程序中的先读后写,或先写后读,不能被打乱。这是合乎逻辑的。2. 依赖性的内存访问,也必须是有序的。如从内存对象A中加载地址,再依据读到的地址,读取所指向的值。不能被打乱。这也是合乎逻辑的。只有至少保证这两点,单线程语义才能保证:the complete prediction of the behavior of a thread based on the values seen by read actions within the thread.线程内语义(Intra-thread semantics)是对单线程语义的推广。即单线程语义,再加上:with the exception that the values seen by each read are determined by the memory model.在保持这层语义上,运行时环境有足够自由schedule指令的运行顺序。换句话说,它可以合理的方式重排指令,只要结果表现得像按你写的指令顺序一样就行。2、 program orderAmong all the inter-thread actions performed by each thread t, the program order of t is a total order that reflects the order in which these actions would be performed according to the intra-thread semantics of t.program order 作用实体是每线程, 建立于线程内语义之上。前面说线程内语义赋给运行时环境足够的自由重排指令了。因此,此时的program order已经不再只是纸面上写的指令的原始顺序了,而是运行时环境智能重排后的顺序。在这个基础上,program order表现的就是发射给JVM执行的顺序。这个顺序仍然是total order的。

一只萌萌小番薯

1、首先要对java的内存模型有一个大致的了解,内存在JVM中分为堆内存和栈内存2、不同的内存区域存储的信息是不一样的,而导致的错误也不一样3、在栈中当用户指定虚拟机栈的内存时,当计算线程所需的栈内存大小大过指定的内存是会抛出stackOverFlow错误。4、堆内存是所有jvm线程共享的内存。 堆是所有类实例和数组的内存分配的运行时数据区。如果计算需要比自动存储管理系统更多的堆,Java虚拟机会抛出一个OutOfMemoryError异常。
打开App,查看更多内容
随时随地看视频慕课网APP