并發(fā)編程基礎(chǔ)現(xiàn)代計(jì)算機(jī)硬件原理圖_第1頁(yè)
并發(fā)編程基礎(chǔ)現(xiàn)代計(jì)算機(jī)硬件原理圖_第2頁(yè)
并發(fā)編程基礎(chǔ)現(xiàn)代計(jì)算機(jī)硬件原理圖_第3頁(yè)
并發(fā)編程基礎(chǔ)現(xiàn)代計(jì)算機(jī)硬件原理圖_第4頁(yè)
并發(fā)編程基礎(chǔ)現(xiàn)代計(jì)算機(jī)硬件原理圖_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

P的運(yùn)行原理就是:控制單元在時(shí)序脈沖的作用下,將指令計(jì)數(shù)器里所指向的指令地址(這個(gè)地址是在內(nèi)存里的)送到地址總線上去,然后PU將這個(gè)地址里的指令讀到指令寄存器進(jìn)行譯碼。對(duì)于執(zhí)行指令過(guò)所需要用到的數(shù)據(jù),會(huì)將數(shù)據(jù)地址也送到地址總線,然后P把數(shù)據(jù)讀到P的內(nèi)部單元(就是內(nèi)部寄存器)暫存起來(lái),最后命令運(yùn)算單元對(duì)數(shù)據(jù)進(jìn)行處理加工。周而復(fù)始,一直這樣執(zhí)行下去。CPU多cupCPU,CPU通過(guò)總線進(jìn)行通信,效率比較低。多cpu。多核cup:不同的核可以通過(guò)L3cache進(jìn)行通信,和外設(shè)通過(guò)總線與CPU通信。多核cpu的運(yùn)行,CU寄存器:每個(gè)PU都包含一系列的寄存器,它們是PU內(nèi)內(nèi)存的基礎(chǔ)。PU在寄存器上執(zhí)行操作的速度遠(yuǎn)大于在主存上執(zhí)行的速度。這是因?yàn)镻U寄存器的速度遠(yuǎn)大于主存。CU緩存:即高速緩沖器,是位于PU與主內(nèi)存間的一種容量較小但速度很高的器。由于PU的速度遠(yuǎn)高于主內(nèi)存,P直接從內(nèi)存中存取數(shù)據(jù)要等待一定時(shí)間周期,Cc中保存著P剛用過(guò)或循環(huán)使用的一部分?jǐn)?shù)內(nèi)存:一個(gè)計(jì)算機(jī)還包含一個(gè)主存,所有的CPU都可以主存。主存通常比CPU中的緩存大得多。緩存一致性問(wèn)題(MinMemory)?;诟咚倬彺娴慕换ズ芎玫亟鉀Q了處理器與內(nèi)存的速度,但是也引入了新的問(wèn)題:緩存一致性(CacheCoheenc)。當(dāng)多個(gè)處理器的運(yùn)算任務(wù)都涉及同一塊主內(nèi)存區(qū)域時(shí),將可能導(dǎo)致各自的緩存數(shù)據(jù)不一致的情況,如果真的發(fā)生這種情況,那同步回到主內(nèi)存時(shí)以誰(shuí)的緩存數(shù)據(jù)為準(zhǔn)呢?為了解決一致性的問(wèn)題,需要各個(gè)處理器緩存時(shí)都遵循一些協(xié)議,在讀寫時(shí)要根據(jù)協(xié)議來(lái)進(jìn)行操作,這類協(xié)議有MS、ES(IlliisPtocol)、SI、Sys、i?及DaPtocol等等。進(jìn)程是程序的一次執(zhí)行,一個(gè)程序有至少一個(gè)進(jìn)程,是資源分配的最小單位,資源分配包括cp存、磁盤等。線程是程序執(zhí)行的最小單位,CU調(diào)度的基本單元,一個(gè)進(jìn)程有至少一個(gè)線程。(1)進(jìn)程是資源的分配和調(diào)度的一個(gè)獨(dú)立單元,而線程是CPU調(diào)度的基本單元(2)同一個(gè)進(jìn)可以(3)進(jìn)程的創(chuàng)建調(diào)用for或者fr,而線程的創(chuàng)建調(diào)用ptha_ct,進(jìn)程結(jié)束后它擁有的所有線將銷毀,而線程的結(jié)束不會(huì)影響同個(gè)進(jìn)的其他線程的結(jié)束(4)線程是輕量級(jí)的進(jìn)程,它的創(chuàng)建和銷毀所需要的時(shí)間比進(jìn)程小很多,所有操作系統(tǒng)中的執(zhí)行功能都是創(chuàng)建線程去完成的()線執(zhí)行時(shí)一般都要進(jìn)行同步和互斥,因?yàn)樗麄児蚕硗贿M(jìn)程的所有資源()線程有自己的私有屬性線程控制塊CB,線程i,寄存器、上下文,而進(jìn)程也有自己的私有屬性進(jìn)程控制塊PCB,這些私有屬性是不被共享的,用來(lái)標(biāo)示一個(gè)進(jìn)程或一個(gè)線程的標(biāo)志并發(fā)(ocuc):指在同一時(shí)刻只能有一條指令執(zhí)行,但多個(gè)進(jìn)程指令被快速的輪換執(zhí)行,使得在宏觀上具有多個(gè)進(jìn)程同時(shí)執(zhí)行的效果,但在微觀上并不是同時(shí)執(zhí)行的,只是把時(shí)間分成若干段,使多個(gè)進(jìn)程快速交替的執(zhí)行。并行在多處理器系統(tǒng)中存在,而并發(fā)可以在單處理器和多處理器系統(tǒng)中都存在,并發(fā)能夠在單處理器系統(tǒng)中存在是因?yàn)椴l(fā)是并行的假象,并行要求程序能夠同時(shí)執(zhí)行多個(gè)操作,而并發(fā)只是要求程序假裝同時(shí)執(zhí)行多個(gè)操作(每個(gè)小時(shí)間片執(zhí)行一個(gè)操作,多個(gè)操作快速切換執(zhí)行)線程上下文的切換巧妙的利用了時(shí)間片輪轉(zhuǎn)的方式,PU給每個(gè)任務(wù)都服務(wù)一定的時(shí)間,然后把當(dāng)前任務(wù)的狀態(tài)保存下來(lái),在加載下一任務(wù)的狀態(tài)后,繼續(xù)服務(wù)下一個(gè)任務(wù);線程狀態(tài)的保存及其再加載,就是線程的上下文切換。時(shí)間片輪詢保證P的利用率。寄存器:是P內(nèi)部數(shù)量少但是速度很快的內(nèi)存。寄存器通常對(duì)常用值的快速來(lái)提高計(jì)算機(jī)程序運(yùn)行的速度;程序計(jì)數(shù)器:是一個(gè)專門的寄存器,用于表明系統(tǒng)中P的執(zhí)行位置,存的值為正在執(zhí)行的指令或者下一個(gè)需要被執(zhí)行的指令的位置。上下文切換的活動(dòng):a.掛起一個(gè)線程,將這個(gè)進(jìn)程在CPU中的狀態(tài)于內(nèi)存中的某處;b.在內(nèi)存中檢索下一個(gè)進(jìn)程的上下文并將其CPU的寄存器恢復(fù);c.跳轉(zhuǎn)到程序計(jì)數(shù)器所指定的位置;在編譯原理中,將源代碼編譯成機(jī)器碼,主要經(jīng)過(guò)下面幾個(gè)步驟在Java中前端編譯是指把.java文件轉(zhuǎn)變成.class文件的過(guò)程后端編譯是指把字節(jié)碼轉(zhuǎn)變成機(jī)器碼的過(guò)在后端編譯階段,JVM通過(guò)解釋字節(jié)碼將其翻譯成對(duì)應(yīng)的機(jī)器指令,逐條讀入,逐條解釋翻譯。然,經(jīng)過(guò)解釋執(zhí)行,其執(zhí)行速度必然會(huì)比可執(zhí)行的二進(jìn)制字節(jié)碼程序慢很多。這就是傳統(tǒng)的JVM的解釋器(Interptr)的功能。為了解決這種效率問(wèn)題,引入了JIT(即時(shí)編譯)技術(shù)。JA程序還是通過(guò)解釋器進(jìn)行解釋執(zhí)行,當(dāng)JVM發(fā)現(xiàn)某個(gè)方法或代碼塊運(yùn)行特別頻繁的時(shí)候,就會(huì)認(rèn)為這是熱點(diǎn)代碼(HotSptCe)。然后JIT會(huì)把部分熱點(diǎn)代碼”翻譯成本地機(jī)器相關(guān)的機(jī)器碼,并進(jìn)行優(yōu)化,然后再把翻譯后的機(jī)器碼緩存起來(lái),以備下次使用。JITJustInTimeCompiler)工作原理熱點(diǎn)探測(cè)(HotSpot基于采樣的方式探測(cè)(SamleBsedHtSptDtctio):周期性檢測(cè)各個(gè)線程的棧頂,發(fā)現(xiàn)某個(gè)方法經(jīng)常出現(xiàn)在棧頂,就認(rèn)為是熱點(diǎn)方法。好處就是簡(jiǎn)單,缺點(diǎn)就是無(wú)法精確確認(rèn)一個(gè)方法的熱度。容易受線程阻塞或別的原因干擾熱點(diǎn)探測(cè)?;谟?jì)數(shù)器的熱點(diǎn)探測(cè)(CoutrBasedHotSpotDtecti)。采用這種方法的虛擬機(jī)會(huì)為每個(gè)方法,甚至是代碼塊建立計(jì)數(shù)器,統(tǒng)計(jì)方法的執(zhí)行次數(shù),某個(gè)方法超過(guò)閥值就認(rèn)為是熱點(diǎn)方法,觸發(fā)JIT編譯。在HtSpt虛擬機(jī)中使用的是第二種——數(shù)器:方法調(diào)用計(jì)數(shù)器和回邊計(jì)數(shù)器?;剡呌?jì)數(shù)器:是記錄方法中的fo或者wil編譯優(yōu)化JIT聯(lián)、空值檢查消除、類型檢測(cè)消除、公共子表達(dá)式消除。sfepint可以用在不同地方,比如GC、Deoptiiztion,在HtsptVM中,GCsfepoitGC管理的指針。從線程角度看,sfepoit可以理解成是在代碼執(zhí)行過(guò)的一些特殊位置,當(dāng)線程執(zhí)行到這些位置的時(shí)候,說(shuō)明虛擬機(jī)當(dāng)前的狀態(tài)是安全的,如果有需要,可以在這個(gè)位置暫停,比如發(fā)生GC時(shí),需要暫停所有活動(dòng)線程,但是該線程在這個(gè)時(shí)刻,還沒(méi)有執(zhí)行到一個(gè)安全點(diǎn),所以該線程應(yīng)該繼續(xù)執(zhí)行,到達(dá)下一個(gè)安全點(diǎn)的時(shí)候暫停,然后才開(kāi)始GC,該線程等待GC結(jié)束。所以,程序在執(zhí)行的時(shí)候并非在所有地方都能停頓下來(lái)gc,只有到達(dá)安全點(diǎn)才能停頓。安全點(diǎn)的選定是以“是否具有讓程序長(zhǎng)時(shí)間執(zhí)行的特性”為標(biāo)準(zhǔn),因?yàn)榘踩c(diǎn)過(guò)少的話c停頓時(shí)間就會(huì)很長(zhǎng),安全點(diǎn)過(guò)多又會(huì)增加運(yùn)行時(shí)負(fù)荷。”長(zhǎng)時(shí)間執(zhí)行“最明顯的特征就是指令序列復(fù)用,如方法調(diào)用,循環(huán)跳轉(zhuǎn),異常跳轉(zhuǎn)等。所有這些功能的指令才會(huì)產(chǎn)生安全點(diǎn)。在gc發(fā)生時(shí)讓所有線程跑到最近的安全點(diǎn)后停頓。兩種思路:第一種,搶先式中斷,gc發(fā)生時(shí),讓所有線斷,如果有線程不在安全點(diǎn),那么讓線程跑到安全點(diǎn)。第二種,主動(dòng)式中斷,設(shè)置一個(gè)標(biāo)識(shí),各個(gè)安全區(qū)域是指在一段代碼片段中,關(guān)系不會(huì)發(fā)生變化,在該區(qū)域的任何地方發(fā)生c都是安全的。當(dāng)代碼執(zhí)行到安全區(qū)域時(shí),首先標(biāo)示自己已經(jīng)進(jìn)入了安全區(qū)域,那樣如果在這段時(shí)間里jvm發(fā)起c,就不用管標(biāo)示自己在安全區(qū)域的那些線程了,程離開(kāi)安全區(qū)域時(shí),會(huì)檢查系統(tǒng)是否正在執(zhí)行c,如果是那么就等到gc完成后再離開(kāi)安全區(qū)域。happens-從JDK5開(kāi)始,JMM使用happens-before的概念來(lái)闡述多線程之間的內(nèi)存可見(jiàn)性。在JMM中,如果一happes-bf原則非常重要,它是判斷數(shù)據(jù)是否存在競(jìng)爭(zhēng)、線程是否安全的主要依據(jù),依靠這個(gè)原則,我們解決在并發(fā)環(huán)境下兩操作之間是否可能存在的所有問(wèn)題。下面我們就一個(gè)簡(jiǎn)單的例子稍了解下happes-bfe;ii=j=ij是否等于1呢?假定線程A的操作(i=1)happens-before線程B的操作(j=i),那么可以確定線程B執(zhí)行后j=1一定成立,如果他們不存在happens-before原則,那么j=1不一定成立。這就是happens-如果一個(gè)操作appens-bfe另一個(gè)操作,那么第一個(gè)操作的執(zhí)行結(jié)果將對(duì)第二個(gè)操作可見(jiàn),而且第一個(gè)操作的執(zhí)行順序排在第二個(gè)操作之前。兩個(gè)操作之間存在appens-bfe關(guān)系,并不意味著一定要按照happes-bfoe原則制定的順序來(lái)執(zhí)行。如果重排序之后的執(zhí)行結(jié)果與按照happen-bfe關(guān)系來(lái)執(zhí)行的結(jié)果一致,那么這種重排序并不。 鎖定規(guī)則:個(gè)unLock操作先行發(fā)生于后面對(duì)同個(gè)鎖的lock 線程終結(jié)規(guī)則:線 所有的操作都先行發(fā)生于線程的終止檢測(cè),我們可以通過(guò)Thread.join()方法結(jié)束、Thread.isAlive()的返回值 檢測(cè)到線程已經(jīng)終止執(zhí)行; 程序次序規(guī)則:一段代碼在單線執(zhí)行的結(jié)果是有序的。注意是執(zhí)行結(jié)果,因?yàn)樘摂M機(jī)、處理器會(huì)對(duì)指令進(jìn)行重排序(重排序后面會(huì)詳細(xì)介紹)。雖然重排序了,但是并不會(huì)影響程序的執(zhí)行結(jié)果,所以程序最終執(zhí)行的結(jié)果與順序執(zhí)行的結(jié)果是一致的。故而這個(gè)規(guī)則只對(duì)單線程有效,在多線程環(huán)境下無(wú)法保證正確性。鎖定規(guī)則必須先執(zhí)行ulock操作后面才能進(jìn)行l(wèi)ck操作。oate變量規(guī)則:這是一條比較重要的規(guī)則,它標(biāo)志著vltil保證了線程可見(jiàn)性。通俗點(diǎn)講就是如果一個(gè)線程先去寫一個(gè)vltile變量,然后一個(gè)線程去讀這個(gè)變量,那么這個(gè)寫操作一定是apes-bfo讀操作的。傳遞規(guī)則:提現(xiàn)了happens-before原則具有傳遞性,即Ahappens-beforeB,Bhappens-beforeC,那么Ahappens-beforeC線程啟動(dòng)規(guī)則:假定線程A在執(zhí)行過(guò),通過(guò)執(zhí)行head.strt(來(lái)啟動(dòng)線程B,那么線程A共變量的修改在接下來(lái)線程B開(kāi)始執(zhí)行后確保對(duì)線程B可見(jiàn)。線程終結(jié)規(guī)則:假定線程A在執(zhí)行的過(guò),通過(guò)制定Tea.ji(等待線程B終止,那么線程B止之前對(duì)共享變量的修改程A等待返回后可見(jiàn)。將將個(gè)元素放入個(gè)線程安全的隊(duì)列的操作Happens-Before將個(gè)元素放入個(gè)線程安全容器的操作Happens-Before 釋放 的操作Happens-Before獲 操 這里再說(shuō)一遍happens-before的概念:如果兩個(gè)操作不存在上述(前面8條+后面6條)任一一個(gè)操作Ahappens-before操作B,那么操作A在內(nèi)存上所做的操作對(duì)操作B都是可見(jiàn)的。privateprivateinti=j){i=j;}publicread(){return}我們約定線程A執(zhí)行write(),線程B執(zhí)行a(),且線程A優(yōu)先于線程B執(zhí)行,那么線程B獲得結(jié)果是什么?;我們就這段簡(jiǎn)單的代碼一次分析happes-bfoe的規(guī)則(規(guī)則、6、、8+推導(dǎo)的6):變量i不是用vle修飾的,所以vlle變量規(guī)則不滿足;傳遞規(guī)則肯定不滿足;所以我們無(wú)法通過(guò)happes-bfoe原則推導(dǎo)出線程Ahappen-bf線程B,雖然可以確認(rèn)在時(shí)間上線程A優(yōu)先于線程B指定,但是就是無(wú)法確認(rèn)線程B獲得的結(jié)果是什么,所以這段代碼不是線程安全的。那么怎么修復(fù)這段代碼呢?滿足規(guī)則2、任一即可。inx的架構(gòu)中,很重要的一個(gè)能力就是系統(tǒng)資源的能力。但是,系統(tǒng)資源是有限的,如果不加限制的允許任何程序以任何方式去系統(tǒng)資源,必然會(huì)造成資源的浪費(fèi),發(fā)生資源不足等情況。為了減少這種情況的發(fā)生,in制定了一個(gè)等級(jí)制定,即。inux將分成兩個(gè)層次,以0和標(biāo)識(shí)。0的級(jí)要高于3。換句話說(shuō),0級(jí)在系統(tǒng)資源上是沒(méi)有任何限制的,可以執(zhí)行任何操作,而3,In x架構(gòu)使用了個(gè)級(jí)別來(lái)標(biāo)明不同的級(jí)權(quán)限。R0實(shí)際就是內(nèi)核態(tài),擁有最高權(quán)限。而一般應(yīng)用程序處于狀態(tài)--用戶態(tài)。在inx中,還存在和2兩個(gè)級(jí)別,一般歸屬驅(qū)動(dòng)程序的級(jí)別。在Windws平臺(tái)沒(méi)有1和兩個(gè)級(jí)別,只用0內(nèi)核態(tài)和3用戶態(tài)。在權(quán)限約束上,使用的是高等級(jí)狀態(tài)可以閱讀級(jí)狀態(tài)的數(shù)據(jù),例如進(jìn)程上下文、代碼、數(shù)據(jù)等等,但是反之則不可。最可讀取R03所有的內(nèi)容,1可以讀R13的,以此類推,3只能讀自己的數(shù)據(jù)。設(shè)備中斷。在使用設(shè)備時(shí),如設(shè)備完成了用戶請(qǐng)求,就會(huì)向CPU發(fā)送一個(gè)中斷信號(hào),此時(shí)用戶線程:指不需要內(nèi)核支持而在用戶程序中實(shí)現(xiàn)的線程,其不依賴于操作系統(tǒng),應(yīng)用進(jìn)程利用線提供創(chuàng)建、同步、調(diào)度和管理線程的函數(shù)來(lái)控制用戶線程。另外,用戶線程是由應(yīng)用進(jìn)程利用線程庫(kù)創(chuàng)建和管理,不依賴于操作系統(tǒng)。不需要用戶態(tài)/態(tài)切換,速度快。操作系統(tǒng)內(nèi)核不知道多線程的存在,因此一個(gè)線程阻塞將使得整個(gè)進(jìn)程(包括它的所有線程)阻塞分配是以進(jìn)程為基本單位,所以每個(gè)線程執(zhí)行的時(shí)間相對(duì)減少。內(nèi)核線程:線程的所有管理操作都是由操作系統(tǒng)內(nèi)核完成的。內(nèi)核保存線程的狀態(tài)和上下文信息,當(dāng)一個(gè)線程執(zhí)行了引起阻塞的系統(tǒng)調(diào)用時(shí),線程相比這些操作要慢得多,但是仍然比進(jìn)程的創(chuàng)建和管理操作要快。大多數(shù)市場(chǎng)上的操作系統(tǒng),如Windws,inx等都支持內(nèi)核級(jí)線程。JVMJJVNedsciv也不能完全是跨平立的,對(duì)線程調(diào)度處理非常敏感的業(yè)務(wù)開(kāi)發(fā)必須關(guān)注底層操作系統(tǒng)的線程調(diào)度差異,所以理解線程的時(shí)候,一個(gè)線程是jva線程對(duì)象,一個(gè)是調(diào)度器的線程(vm)。new使用JNI將一個(gè)nativethreadattach到JVM針對(duì)newjava.lang.Thread().start()這種方式,只有調(diào)用start()方法的時(shí)候,才會(huì)真正的在JVM中去創(chuàng)建創(chuàng)建實(shí)際的底層操作系統(tǒng)的native底層的nativethread開(kāi)始運(yùn)行,調(diào)用java.lang.Thread生成的Object的run()當(dāng)java.lang.Thread生成的Object的run()方法執(zhí)行完畢返回后,或者拋出異常終止后,終止native針對(duì)JNI將一個(gè)nativethreadattach到JVM通過(guò)JNIcallAttachCurrentThread申請(qǐng)連接到執(zhí)行的JVM當(dāng)通過(guò)JNIcallDetachCurrentThread之后,JNI就從JVMJVM清除相應(yīng)的JavaThread,OSThread,java.lang.ThreadCAS pareAndSwap,直譯就是比較交換。是一條CPU的原子指令,其作用是讓CPU先進(jìn) 的CPU中,使用的是cmpxchg指令,就是說(shuō)CAS利用P的CAS指令,同時(shí)借助JN來(lái)完成Java的非阻塞算法,其它原子操作都是利用類似的特性完成的。在jav.til.concret下面的源碼中,Atic,Rttck都使用了UsfCAS(V)、預(yù)期原值(A)和新值(B)期原值相匹配,那么處理器會(huì)自動(dòng)將該位置值更新為新值。否則,處理器不做任何操作。內(nèi)置鎖在Java中被抽象為監(jiān)視器鎖(montor)。在JDK1.之前,監(jiān)視器鎖可以認(rèn)為直接對(duì)應(yīng)底層操作系統(tǒng)中的互斥量(mx)。這種同步方式的成本非常高,包括系統(tǒng)調(diào)用引起的內(nèi)核態(tài)與用戶態(tài)切換、線程阻塞造成的線程切換等。因此,后來(lái)稱這種鎖為重量級(jí)鎖。首先,內(nèi)核態(tài)與用戶態(tài)的切換上不容易優(yōu)化。但通過(guò)自旋鎖,可以減少線程阻塞造成的線程切換(掛起線程和恢復(fù)線程)。如果鎖的粒度小,那么鎖的持有時(shí)間比較短(盡管具體的持有時(shí)間無(wú)法得知,但可以認(rèn)為,通常有一部分鎖能滿足上述性質(zhì))。那么,對(duì)于競(jìng)爭(zhēng)這些鎖的而言,因?yàn)殒i阻塞造成線程切換的時(shí)間與鎖持有的時(shí)間相當(dāng),減少線程阻塞造成的線程切換,能得到較大的性能提升。具體如下:不直接阻塞自己,而是自旋(空等待,比如一個(gè)空的有限f循環(huán))在自旋的同時(shí)重新競(jìng)爭(zhēng)鎖鎖的持有時(shí)間比較短”這一條件可以放寬。實(shí)際上,只要鎖競(jìng)爭(zhēng)的時(shí)間比較短(比如線程2才會(huì)來(lái)競(jìng)爭(zhēng)鎖),就能夠提高自旋獲得鎖的概率。這通常發(fā)生在鎖持有時(shí)間長(zhǎng),但競(jìng)爭(zhēng)不激烈的場(chǎng)景中。單核處理器上,不存在實(shí)際的并行,當(dāng)前線程不阻塞自己的話,舊wner就不能執(zhí)行,鎖不釋放,此時(shí)不管自旋多久都是浪費(fèi);進(jìn)而,如果線程多而處理器少,自旋也會(huì)造成不少無(wú)謂的浪費(fèi)。如果鎖競(jìng)爭(zhēng)的時(shí)間比較長(zhǎng),那么自旋通常不能獲得鎖,白白浪費(fèi)了自旋占用的P激烈的場(chǎng)景中,此時(shí)應(yīng)主動(dòng)禁用自旋鎖。定:如果在同一個(gè)鎖對(duì)象上,自旋等待剛剛成功獲得過(guò)鎖,并且持有鎖的線程正在運(yùn)行中,那么虛擬機(jī)就會(huì)認(rèn)為這次自旋也很有可能再次成功,進(jìn)而它將允許自旋等待持續(xù)相對(duì)更長(zhǎng)的時(shí)間,比如00個(gè)循環(huán)。至省略自旋過(guò)程,以避免浪費(fèi)處理器資源。自適應(yīng)自旋解決的是“鎖競(jìng)爭(zhēng)時(shí)間不確定的問(wèn)題。JVM很難感知到確切的鎖競(jìng)爭(zhēng)時(shí)間,而交給用戶分析就了JVM的設(shè)計(jì)初衷。自適應(yīng)自旋假定不同線程持有同一個(gè)鎖對(duì)象的時(shí)間基本相當(dāng),競(jìng)爭(zhēng)程度趨于穩(wěn)定,因此,可以根據(jù)上一次自旋的時(shí)間與結(jié)果調(diào)整下一次自旋的時(shí)間。自旋鎖的目標(biāo)是降低線程切換的成本。如果鎖競(jìng)爭(zhēng)激烈,我們不得不依賴于重量級(jí)鎖,讓競(jìng)爭(zhēng)失敗的線程阻塞;如果完全沒(méi)有實(shí)際的鎖競(jìng)爭(zhēng),那么申請(qǐng)重量級(jí)鎖都是浪費(fèi)的。輕量級(jí)鎖的目標(biāo)是,減少無(wú)實(shí)際競(jìng)爭(zhēng)情況

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論