2004-10-25
第八章線程和鎖
這章描述的是非常底層的jvm運(yùn)作的時(shí)候的概念上的部分模型,與前部分的編譯不屬于一個(gè)層次。
本章提到的變量概念是指類實(shí)例,類變量,和類數(shù)組。而參數(shù)和局部變量并不強(qiáng)行要求到這個(gè)變量概念之中。
8。1術(shù)語(yǔ)和框架
jvm中有主寄存器,當(dāng)一個(gè)線程被啟動(dòng)時(shí),會(huì)創(chuàng)建自己的工作寄存器,當(dāng)線程運(yùn)行,會(huì)對(duì)主寄存器中的數(shù)據(jù)進(jìn)行拷貝,存入自己的工作寄存器中。
主寄存器包含每個(gè)變量的主拷貝。
主寄存器也包含鎖,每個(gè)對(duì)象有個(gè)與其相關(guān)的鎖。線程可以競(jìng)爭(zhēng)獲得一個(gè)鎖。
相關(guān)術(shù)語(yǔ):
use,assign,load,store,lock,unlock為線程可以執(zhí)行的動(dòng)作。
read,write,lock,unlock為主存儲(chǔ)器子系統(tǒng)可以執(zhí)行的動(dòng)作。
use,assign是線程執(zhí)行引擎與工作存儲(chǔ)之間的緊密耦合交互作用。
lock,unlock是線程執(zhí)行引擎與主存儲(chǔ)之間的緊密耦合交互作用。
主存儲(chǔ)與工作存儲(chǔ)之間卻是松散耦合的。
分別對(duì)應(yīng)的動(dòng)作就是:load,store和lock,unlock
注意有三個(gè)實(shí)體在協(xié)同工作:主存儲(chǔ)器,工作存儲(chǔ)器,線程運(yùn)行引擎
8。2執(zhí)行順序和一致性。
1。同線程執(zhí)行動(dòng)作排序
2、主存儲(chǔ)執(zhí)行的、對(duì)同一變量的動(dòng)作排序
3、主存儲(chǔ)執(zhí)行的、對(duì)同一鎖的動(dòng)作排序
4、不允許一個(gè)動(dòng)作跟在其自身后面。
第4點(diǎn)特殊說(shuō)明:雖然看起來(lái)無(wú)關(guān)緊要,但必須顯式說(shuō)明,以保證完整性。因?yàn)檫@種危險(xiǎn)確實(shí)存在。
線程的動(dòng)作和主存儲(chǔ)的動(dòng)作間的約束:
1、每個(gè)lock和unlock動(dòng)作必須由一些線程和主存儲(chǔ)共同執(zhí)行。
2、每個(gè)load動(dòng)作,唯一的與一個(gè)write動(dòng)作配對(duì),這樣write動(dòng)作跟在store動(dòng)作后。
8。3有關(guān)變量的規(guī)則
線程T對(duì)變量V的操作約束:
1、T執(zhí)行過(guò)程中只有需要相應(yīng)使用V時(shí)才調(diào)用use,或者assign動(dòng)作。
2、T執(zhí)行的assign動(dòng)作必須插入到T對(duì)V的load或者store和后繼的由T執(zhí)行的對(duì)V的store之間。(保證主存儲(chǔ)內(nèi)值的正確,同時(shí)保證assign動(dòng)作之前工作存儲(chǔ)內(nèi)存在V)
3、在T對(duì)V執(zhí)行use和store之前,必須執(zhí)行assign或load操作(保證工作存儲(chǔ)器中有V,并且已經(jīng)初始化)
4、在V創(chuàng)建后,每個(gè)T在use或store之前,必須執(zhí)行assign或load操作。
對(duì)于第4點(diǎn):volatile(易變)變量有更嚴(yán)格的約束
由主存儲(chǔ)器執(zhí)行的read和right操作的約束:
1、T對(duì)V的load,必須先有對(duì)應(yīng)的read
2、T對(duì)V的store,必須后繼對(duì)應(yīng)的write
3、動(dòng)作A,B是T對(duì)V的load或store動(dòng)作,P,Q為對(duì)應(yīng)的read或write,如果A優(yōu)先于B,則P必須有些于Q
?
8.4Double和long變量的非原子處理
由于32位機(jī)器的效率問(wèn)題,有些jvm實(shí)現(xiàn)對(duì)double和long這種64位值操作是非原子的,導(dǎo)致一些同步問(wèn)題(如程序員總是需要顯式指定同步于對(duì)double和long上的操作),其實(shí)這只是一種軟件設(shè)計(jì)對(duì)硬件的妥協(xié)而已。
8。5有關(guān)鎖的規(guī)則
線程為T,鎖為L(zhǎng),T執(zhí)行的關(guān)于L的操作約束如下:
1、T對(duì)L的lock操作,必須對(duì)于每個(gè)不是T的線程S,S對(duì)L的unlock操作數(shù)等于之前的S對(duì)L的lock操作數(shù)
2、T對(duì)L的unlock操作,必須要求先前T對(duì)L的unlock操作數(shù),小于先前T對(duì)L的lock操作數(shù)(不解不擁有的鎖)
8。6有關(guān)鎖和變量交互作用的規(guī)則
線程T,鎖L,變量V,T執(zhí)行的關(guān)于L和V的操作約束如下:
1、在t對(duì)V的assign和隨后的unlock之間,必須插入store操作。對(duì)應(yīng)于該store的write操作必須先于unlock操作(保證L對(duì)于V的有效性)。
2、在lock和隨后執(zhí)行的use或store之間,必須插入assign或load操作。
8。7有關(guān)volatile(易變)變量的規(guī)則
線程T,易變變量V和W
1、load和use操作必須成對(duì)出現(xiàn),緊挨在一起,并且load操作在前
2、assign和store操作必須成對(duì)出現(xiàn),緊挨在一起,并且assign操作在前
3、A、B為T對(duì)V的use或assign,F、G為對(duì)應(yīng)的load或store,P、Q為對(duì)應(yīng)的read或write,如果A先于B,則P必須優(yōu)先于Q。
8。8先見(jiàn)存儲(chǔ)操作
如果變量沒(méi)有聲明為violate,則store操作可以提前于assign,store操作將將要賦給V的值替代V實(shí)際的值進(jìn)行store操作,只要滿足:
1、如果發(fā)生store,必然發(fā)生assign。
2、重定位的store和assign間未插入鎖定操作。
3、重定位的store和assign間未插入對(duì)V的load
4、重定位的store和assign間未插入其他對(duì)V的store
5、store操作將assign操作要放到線程T的Z作為存儲(chǔ)器中的值傳到主存儲(chǔ)器。
8。9討論
8。10可能的交換
一個(gè)關(guān)于同步和鎖的小例子。
8。11范例:無(wú)序?qū)?br />另一個(gè)例子
8。12線程
線程由Thread和ThreadGroup類創(chuàng)建并管理。創(chuàng)建Thread對(duì)象就創(chuàng)建一個(gè)線程,而且是創(chuàng)建線程的唯一方式。當(dāng)線程被創(chuàng)建時(shí),它還不是活躍的,當(dāng)其start方法被調(diào)用時(shí),開(kāi)始運(yùn)行。
8。13鎖和同步
每個(gè)對(duì)象都有與其關(guān)聯(lián)的鎖。
當(dāng)synchronized方法被調(diào)用時(shí),它自動(dòng)執(zhí)行鎖定操作;如果該方法是實(shí)例方法,它鎖定同實(shí)例相關(guān)聯(lián)的鎖,如果方法是static的,它鎖定同Class對(duì)象相關(guān)聯(lián)的鎖
8。13等待集和通知
每個(gè)對(duì)象除了相關(guān)的鎖外,還有相關(guān)的等待集,即一組線程,首次創(chuàng)建的對(duì)象,等待集為空。
講述了wait,notify,notifyall幾個(gè)方法,wait方法往等待集中增加內(nèi)容,而notify或notifyall方法從等待集中刪除內(nèi)容。
但不能完全讀懂內(nèi)容,可細(xì)研究。
第九章優(yōu)化
本章描述jvm中Sun版本中實(shí)現(xiàn)的優(yōu)化。
在此優(yōu)化中,編譯的jvm代碼在運(yùn)行期修改,利用運(yùn)行期獲得的信息,做比源指令更少的工作,以獲得更好的性能。
9。1通過(guò)重寫(xiě)動(dòng)態(tài)鏈接
對(duì)重寫(xiě)的指令,指令的每個(gè)實(shí)例在其第一次執(zhí)行時(shí)被替換為_(kāi)quick偽指令,該指令實(shí)例隨后執(zhí)行的總是_quick變體。
其余是對(duì)_quick偽指令的描述,可用于查閱,因?yàn)檫@是Sun的jdk在運(yùn)行的時(shí)候的真正指令狀態(tài)。
第十章 操作碼的操作碼助記符
這章主要是個(gè)附錄的功能,可供查閱。
×××××××××××××××××××××××××××××××××××
在延期了將近一個(gè)月了之后,終于算是看過(guò)了一遍這本書(shū),雖然有很多沒(méi)有看的非常明白的地方,但是比我預(yù)期的效果要好了許多了,進(jìn)一步的細(xì)致研究可以安排在后面。