3 回答
TA贡献2019条经验 获得超9个赞
关于Program Order,对于每个线程,他只是一个语句的执行顺序集合定义,在这个集合里语句执行顺序能够保证正确性,即执行结果等于人为阅读代码时的执行结果(例如不管你按什么顺序执行1+1,始终等于2)。而Program Order的正确性保证了Intra-thread consistency.
1、intra-thread semantics
Intra-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 order
Among 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的。
TA贡献1795条经验 获得超7个赞
1、首先要对java的内存模型有一个大致的了解,内存在JVM中分为堆内存和栈内存
2、不同的内存区域存储的信息是不一样的,而导致的错误也不一样
3、在栈中当用户指定虚拟机栈的内存时,当计算线程所需的栈内存大小大过指定的内存是会抛出stackOverFlow错误。
4、堆内存是所有jvm线程共享的内存。 堆是所有类实例和数组的内存分配的运行时数据区。如果计算需要比自动存储管理系统更多的堆,Java虚拟机会抛出一个OutOfMemoryError异常。
添加回答
举报