freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

03講_線程進(jìn)程安全(專業(yè)版)

  

【正文】 :19:2113:19Jan2322Jan23 ? 1越是無(wú)能的人,越喜歡挑剔別人的錯(cuò)兒。 。 2:線程 1首先用 Pen寫字,然后用 Pencil寫字;線程 2首先用 Pencil寫字,然后用 Pen寫字;編寫一個(gè)因?yàn)榫€程 1等待 Pencil,線程 2等待 Pen而造成死鎖的例子,并提出解決方法。若標(biāo)志指出線程應(yīng)當(dāng)恢復(fù),則用一個(gè) notify()重新啟動(dòng)線程。本節(jié)以Java語(yǔ)言為例,講解線程控制中的一些安全問(wèn)題。 解決死鎖沒(méi)有簡(jiǎn)單的方法,這是因?yàn)榫€程產(chǎn)生死鎖都各有各的原因,而且往往具有很高的負(fù)載。這個(gè)“ 等候鏈”如果進(jìn)入封閉狀態(tài),也就是說(shuō),最后那個(gè)對(duì)象等候的是第一個(gè)對(duì)象,此時(shí),所有線程都會(huì)陷入無(wú)休止的相互等待狀態(tài),造成死鎖。 那為什么 sum得到的結(jié)果為 1呢?很明顯,線程 th1的 start函數(shù)運(yùn)行時(shí),相當(dāng)于讓求和過(guò)程以多線程形式運(yùn)行,在它“休眠”之際, th2就搶占了 CPU,在求和還沒(méi)開始做或只完成一部分時(shí)就打印 sum,導(dǎo)致得到不正常結(jié)果。 不過(guò),值得一提的是,如果不能確定整個(gè)函數(shù)都需要同步,那就要盡量避免直接把 synchronized加在函數(shù)定義上的做法。不能是一個(gè)局部變量。當(dāng)然,上面的程序中,沒(méi)有給線程 2以買票的機(jī)會(huì),實(shí)際上票都由線程 1賣出,我們看不出其中的問(wèn)題。一般說(shuō)來(lái),線程的安全性來(lái)源于兩個(gè)方面: 1:多個(gè)線程之間可能會(huì)共享進(jìn)程的內(nèi)存資源。從上節(jié)的程序可以看出,代碼行: 實(shí)際上相當(dāng)于實(shí)例化一個(gè)新的線程對(duì)象,并運(yùn)行該線程中的 run()函數(shù)。代碼如下所示: public class P03_01 { public static void main(String[] args) { while(true) { (Wele)。第三章 線程 /進(jìn)程安全 進(jìn)程和線程是兩個(gè)范圍不同的概念。 try { (1000)。該線程的運(yùn)行并不影響主線程向下執(zhí)行,這是為什么呢? 這是由于多線程的機(jī)制實(shí)際上相當(dāng)于 CPU交替分配給不同的代碼段來(lái)運(yùn)行:也就是說(shuō),某一個(gè)時(shí)間片,某線程運(yùn)行,下一個(gè)時(shí)間片,另一個(gè)線程運(yùn)行,各個(gè)線程都有搶占 CPU的權(quán)利,至于決定哪個(gè)線程搶占,是操作系統(tǒng)需要考慮的事情。 2: CPU的某個(gè)時(shí)間片分配給哪個(gè)線程使用,默認(rèn)情況下無(wú)法由用戶控制。為了讓大家看清這個(gè)問(wèn)題,我們模擬線程 1和線程 2交替賣票的情況。 其原理為:當(dāng)某一線程運(yùn)行同步代碼段時(shí),在“同步鎖對(duì)象”上置一標(biāo)記,運(yùn)行完這段代碼,標(biāo)記消除。如前所述,要控制同步粒度,同步的代碼段越小越好,synchronized控制的范圍越小越好,否則造成不必要的系統(tǒng)開銷。 解決方案 怎樣解決?顯而易見(jiàn),方法是:在運(yùn)行一個(gè)線程時(shí),命令其他線程等待該線程運(yùn)行完畢,才能搶占 CPU進(jìn)行運(yùn)行。盡管這種情況并非經(jīng)常出現(xiàn),但一旦碰到,程序的調(diào)試將變得異常艱難。從技術(shù)上講,可以用如下方法來(lái)進(jìn)行死鎖排除: ? 可以撤消陷于死鎖的全部線程。 Java中提供了對(duì)線程生命周期進(jìn)行控制的函數(shù): ? stop():停止線程; ? suspend():暫停線程的運(yùn)行; ? resume():繼續(xù)線程的運(yùn)行: ? destroy():讓線程銷毀;等等。 3:不推薦使用 stop()來(lái)終止阻塞的線程,而應(yīng)換用由Thread提供的 interrupt()方法,以便中止并退出堵塞的代碼。 3:兩個(gè)線程,向空間有限的數(shù)組中寫數(shù)據(jù)。 2023年 1月 下午 1時(shí) 19分 :19January 22, 2023 ? 1行動(dòng)出成果,工作出財(cái)富。 13:19:2113:19:2113:19Sunday, January 22, 2023 ? 1知人者智,自知者明。 13:19:2113:19:2113:191/22/2023 1:19:21 PM ? 1越是沒(méi)有本領(lǐng)的就越加自命不凡。 2023年 1月 22日星期日 下午 1時(shí) 19分 21秒 13:19: ? 1比不了得就不比,得不到的就不要。 練習(xí) 1:將 。若標(biāo)志指出線程應(yīng)該掛起,便用 wait()命其進(jìn)入等待狀態(tài)。 線程控制安全 安全隱患 ? 線程控制主要是對(duì)線程生命周期的一些操作,如暫停、繼續(xù)、消亡等。但可以通過(guò) java thread dump來(lái)進(jìn)行判斷:一般情況下,當(dāng)死鎖發(fā)生時(shí), Java虛擬機(jī)處于掛起狀態(tài), thread dump可以給出靜態(tài)穩(wěn)定的信息,從操作系統(tǒng)上觀察,虛擬機(jī)的 CPU占用率為零,這時(shí)可以收集 thread dump,查找 waiting for monitor entry的線程,如果大量thread都在等待給同一個(gè)地址上鎖,說(shuō)明很可能死鎖發(fā)生了。如果出現(xiàn)一種極端情況,一個(gè)線程等候另一個(gè)對(duì)象,而另一個(gè)對(duì)象又在等候下一個(gè)對(duì)象,以此類推。運(yùn)行,控制臺(tái)打印如下: 很顯然,這個(gè)結(jié)果不是我們所需要的。 實(shí)際上,在 Java內(nèi),還可以直接把 synchronized關(guān)鍵字直接加在函數(shù)的定義上,這也是一種可以推薦的方法。這里以 Java語(yǔ)言為例,在 Java語(yǔ)言中, synchronized關(guān)鍵字可以解決這個(gè)問(wèn)題,整個(gè)語(yǔ)法形式表現(xiàn)為: 注意, synchronized后的“同步鎖對(duì)象”,必須是可以被各個(gè)線程共享的,如 this、某個(gè)全局標(biāo)量等。 觀察程序中的代碼行 1處的注釋,當(dāng)只剩下一張票時(shí),線程 1賣出了最后一張票,接著要運(yùn)行 ticketNum,但在 ticketNum還沒(méi)來(lái)得及運(yùn)行的時(shí)候,線程 2有可能搶占
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1