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

正文內(nèi)容

線程進(jìn)程安全概述(編輯修改稿)

2025-02-24 22:13 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 his是一個(gè)“同步鎖對(duì)象”。 synchronized(同步鎖對(duì)象 ) { // 訪問共享資源,需要同步的代碼段 } 因此,在上面的案例中,可以將將賣票的代碼用synchronized代碼塊包圍起來(lái),“同步鎖對(duì)象”取 this。 如代碼 。 運(yùn)行,可以得到如下效果。 這說明程序運(yùn)行完全正常。 從以上代碼可以看出,該方法的本質(zhì)是將需要獨(dú)占 CPU的代碼用synchronized(this)包圍起來(lái)。如前所述,一個(gè)線程進(jìn)入這段代碼之后,就在 this上加了一個(gè)標(biāo)記,直到該線程將這段代碼運(yùn)行完畢,才釋放這個(gè)標(biāo)記。如果其他線程想要搶占 CPU,先要檢查 this上是否有這個(gè)標(biāo)記。若有,就必須等待。 但是可以看出,該代碼實(shí)際上運(yùn)行較慢,因?yàn)橐粋€(gè)線程的運(yùn)行,必須等待另一個(gè)線程將同步代碼段運(yùn)行完畢。因此,從性能上講,線程同步是非常耗費(fèi)資源的一種操作。我們要盡量控制線程同步的代碼段范圍,理論上說,同步的代碼段范圍越小,段數(shù)越少越好,因此在某些情況下,推薦將小的同步代碼段合并為大的同步代碼段。 實(shí)際上,在 Java內(nèi),還可以直接把 synchronized關(guān)鍵字直接加在函數(shù)的定義上,這也是一種可以推薦的方法。 不過,值得一提的是,如果不能確定整個(gè)函數(shù)都需要同步,那就要盡量避免直接把 synchronized加在函數(shù)定義上的做法。如前所述,要控制同步粒度,同步的代碼段越小越好,synchronized控制的范圍越小越好,否則造成不必要的系統(tǒng)開銷。所以,在實(shí)際開發(fā)的過程中,要十分小心,因?yàn)檫^多的線程等待可能造成系統(tǒng)性能的下降,甚至造成死鎖。 線程協(xié)作安全 線程協(xié)作 有些情況下,多個(gè)線程合作 完成一件事情的幾個(gè)步驟,此時(shí)線程之間實(shí)現(xiàn)了協(xié)作。如一個(gè)工作需要若干個(gè)步驟,各個(gè)步驟都比較耗時(shí),不能因?yàn)樗鼈兊倪\(yùn)行,影響程序的運(yùn)行效果,最好的方法就是將各步用線程實(shí)現(xiàn)。但是,由于線程隨時(shí)都有可能搶占 CPU,可能在前面一個(gè)步驟沒有完成時(shí),后面的步驟線程就已經(jīng)運(yùn)行,該安全隱患造成系統(tǒng)得不到正確結(jié)果。 案例分析 給出一個(gè)案例:線程 1負(fù)責(zé)完成一個(gè)復(fù)雜運(yùn)算(比較耗時(shí)),線程 2負(fù)責(zé)得到結(jié)果,并將結(jié)果進(jìn)行下一步處理。如:某個(gè)科學(xué)計(jì)算系統(tǒng)中,線程 1負(fù)責(zé)計(jì)算11000各個(gè)數(shù)字的和 (暫且認(rèn)為它非常耗時(shí) ),線程 2負(fù)責(zé)得到這個(gè)結(jié)果并且寫入數(shù)據(jù)庫(kù)。 讀者首先想到的是將耗時(shí)的計(jì)算放入線程。這是正確的想法。首先用傳統(tǒng)線程方法來(lái)編寫這段代碼,代碼如 。 該程序貌似沒有問題,也能夠打印正確結(jié)果,但是和上一節(jié)的例子一樣,它也是很不安全的,這種不安全性也很難發(fā)現(xiàn),也會(huì)給項(xiàng)目后期維護(hù)帶來(lái)巨大的代價(jià)。該程序的安全隱患在哪里呢? 觀察 cal()函數(shù)中的代碼,當(dāng)線程 th1運(yùn)行后,線程 th2運(yùn)行,此時(shí),線程 th2隨時(shí)可能搶占 CPU,而不一定要等線程 th1運(yùn)行完畢。當(dāng)然,在上面的例子中,可能因?yàn)榫€程 th1運(yùn)行較快,th2在它運(yùn)行的過程中沒有搶占 CPU,“碰巧”得到了正確結(jié)果,但是如果讓線程 th2搶占 CPU,這樣,系統(tǒng)可能得不到正確結(jié)果。為了解釋這個(gè)問題,將 該代碼中,增加了一行:程序休眠 1毫秒,讓另一個(gè)線程來(lái)?yè)屨?CPU。運(yùn)行,控制臺(tái)打印如下: 很顯然,這個(gè)結(jié)果不是我們所需要的。 那為什么 sum得到的結(jié)果為 1呢?很明顯,線程 th1的 start函數(shù)運(yùn)行時(shí),相當(dāng)于讓求和過程以多線程形式運(yùn)行,在它“休眠”之際, th2就搶占了 CPU,在求和還沒開始做或只完成一部分時(shí)就打印 sum,導(dǎo)致得到不正常結(jié)果。 解決方案 怎樣解決?顯而易見,方法是:在運(yùn)行一個(gè)線程時(shí),命令其他線程等待該線程運(yùn)行完畢,才能搶占 CPU進(jìn)行運(yùn)行。對(duì)于該問題,不同語(yǔ)言解決方法類似。以 Java語(yǔ)言為例,在 Java語(yǔ)言中,線程的 join()方法可以解決這個(gè)問題。 見代碼 運(yùn)行正常。實(shí)際上,該程序相當(dāng)于摒棄了“線程就是為了程序看起來(lái)同時(shí)做好幾件事情”的思想,將并發(fā)程序又變成了順序的,如果線程 th1沒有運(yùn)行完畢的話,程序會(huì)在 ()處堵塞。如果 cal()函數(shù)耗時(shí)較長(zhǎng),程序?qū)⒁恢钡却?。一般的方法是,可以將該工作放在另一個(gè)線程中,這樣,既不會(huì)堵塞主程序,又能夠保證數(shù)據(jù)安全性。 見代碼 線程死鎖安全 線程死鎖 死鎖 (DeadLock),是指兩個(gè)或兩個(gè)以上的線程在執(zhí)行過程中,因爭(zhēng)奪資源而造成的一種互相等待的現(xiàn)象。此時(shí)稱系統(tǒng)處于死鎖狀態(tài),這些永遠(yuǎn)在互相等待的線程稱為死鎖線程。 產(chǎn)生死鎖的四個(gè)必要條件是: ? 互斥條件:資源每次只能被一個(gè)線程使用。如前面的“線程同步代碼段”,就是只能被一個(gè)線程使用的典型資源; ? 請(qǐng)求與保持條件:一個(gè)線程請(qǐng)求資源,
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1