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異常。
添加回答
舉報