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

正文內(nèi)容

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

2025-02-24 22:13 本頁面
 

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