3 回答

TA貢獻(xiàn)2019條經(jīng)驗(yàn) 獲得超9個(gè)贊
關(guān)于Program Order,對(duì)于每個(gè)線程,他只是一個(gè)語(yǔ)句的執(zhí)行順序集合定義,在這個(gè)集合里語(yǔ)句執(zhí)行順序能夠保證正確性,即執(zhí)行結(jié)果等于人為閱讀代碼時(shí)的執(zhí)行結(jié)果(例如不管你按什么順序執(zhí)行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.
單線程語(yǔ)義是內(nèi)在一致的,這要求運(yùn)行時(shí)環(huán)境(虛擬機(jī)或CPU)在單線程語(yǔ)境下,要至少提供以下保證:
1. 對(duì)同一內(nèi)存對(duì)象的交替讀,寫(xiě),是有序的。程序中的先讀后寫(xiě),或先寫(xiě)后讀,不能被打亂。這是合乎邏輯的。
2. 依賴性的內(nèi)存訪問(wèn),也必須是有序的。如從內(nèi)存對(duì)象A中加載地址,再依據(jù)讀到的地址,讀取所指向的值。不能被打亂。這也是合乎邏輯的。
只有至少保證這兩點(diǎn),單線程語(yǔ)義才能保證:the complete prediction of the behavior of a thread based on the values seen by read actions within the thread.
線程內(nèi)語(yǔ)義(Intra-thread semantics)是對(duì)單線程語(yǔ)義的推廣。即單線程語(yǔ)義,再加上:
with the exception that the values seen by each read are determined by the memory model.
在保持這層語(yǔ)義上,運(yùn)行時(shí)環(huán)境有足夠自由schedule指令的運(yùn)行順序。換句話說(shuō),它可以合理的方式重排指令,只要結(jié)果表現(xiàn)得像按你寫(xiě)的指令順序一樣就行。
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 作用實(shí)體是每線程, 建立于線程內(nèi)語(yǔ)義之上。前面說(shuō)線程內(nèi)語(yǔ)義賦給運(yùn)行時(shí)環(huán)境足夠的自由重排指令了。因此,此時(shí)的program order已經(jīng)不再只是紙面上寫(xiě)的指令的原始順序了,而是運(yùn)行時(shí)環(huán)境智能重排后的順序。
在這個(gè)基礎(chǔ)上,program order表現(xiàn)的就是發(fā)射給JVM執(zhí)行的順序。這個(gè)順序仍然是total order的。

TA貢獻(xiàn)1795條經(jīng)驗(yàn) 獲得超7個(gè)贊
1、首先要對(duì)java的內(nèi)存模型有一個(gè)大致的了解,內(nèi)存在JVM中分為堆內(nèi)存和棧內(nèi)存
2、不同的內(nèi)存區(qū)域存儲(chǔ)的信息是不一樣的,而導(dǎo)致的錯(cuò)誤也不一樣
3、在棧中當(dāng)用戶指定虛擬機(jī)棧的內(nèi)存時(shí),當(dāng)計(jì)算線程所需的棧內(nèi)存大小大過(guò)指定的內(nèi)存是會(huì)拋出stackOverFlow錯(cuò)誤。
4、堆內(nèi)存是所有jvm線程共享的內(nèi)存。 堆是所有類(lèi)實(shí)例和數(shù)組的內(nèi)存分配的運(yùn)行時(shí)數(shù)據(jù)區(qū)。如果計(jì)算需要比自動(dòng)存儲(chǔ)管理系統(tǒng)更多的堆,Java虛擬機(jī)會(huì)拋出一個(gè)OutOfMemoryError異常。
添加回答
舉報(bào)