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

正文內(nèi)容

03講_線程進(jìn)程安全-wenkub

2023-01-23 07:20:02 本頁面
 

【正文】 對象語言,講解線程的的基本機(jī)制,然后講解線程操作過程中的幾個(gè)重要的安全問題:線程同步安全、線程協(xié)作安全、線程死鎖、線程控制,最后講解進(jìn)程安全。比如,需要在控制臺(tái)上每隔 1秒鐘打印一個(gè)歡迎信息。 //代碼行 1 } } 該程序似乎沒有什么問題,運(yùn)行時(shí), Wele也能不斷打印。 在實(shí)際應(yīng)用開發(fā)的過程中 , 經(jīng)常會(huì)出現(xiàn)一個(gè)程序看起來同時(shí)作好幾件事情的情況 , 如 ?? 程序進(jìn)行一個(gè)用時(shí)較長的計(jì)算,希望該計(jì)算進(jìn)行的時(shí)候,程序還可以做其他事情; ? 程序進(jìn)行一個(gè)用時(shí)較長的計(jì)算,希望該計(jì)算進(jìn)行的時(shí)候,程序還可以做其他事情; ? 軟件要能夠接受多個(gè)客戶的請求,而讓客戶感覺不出等待; ? 媒體播放器在播放歌曲的同時(shí)也能下載電影; ? 財(cái)務(wù)軟件在后臺(tái)進(jìn)行財(cái)務(wù)匯總的同時(shí)還能接受終端的請求;等等。比如,媒體播放機(jī)運(yùn)行時(shí)就是一個(gè)進(jìn)程,而媒體播放機(jī)同時(shí)做的下載文件和播放歌曲,就是兩個(gè)線程。當(dāng)程序加載到內(nèi)存時(shí),啟動(dòng)主線程。 WeleThread wt = new WeleThread()。線程有創(chuàng)建、可運(yùn)行、運(yùn)行中、阻塞、死亡五種狀態(tài)。 2:可運(yùn)行狀態(tài):使用 start()方法啟動(dòng)一個(gè)線程后,系統(tǒng)分配了資源,使該線程處于可運(yùn)行狀態(tài)( Runnable)。 線程的安全隱患可能出現(xiàn)在各個(gè)狀態(tài)。 線程同步安全 線程同步 默認(rèn)情況下,線程都是獨(dú)立的,而且異步執(zhí)行,線程中包含了運(yùn)行時(shí)所需要的數(shù)據(jù)或方法,而不需要外部的資源或方法,也不必關(guān)心其它線程的狀態(tài)或行為。 所謂同步,就是在發(fā)出一個(gè)功能調(diào)用時(shí),在沒有得到結(jié)果之前,該調(diào)用就不返回,同時(shí)其它線程也不能調(diào)用這個(gè)方法。首先用傳統(tǒng)方法來編寫這段代碼。 觀察程序中的代碼行 1處的注釋,當(dāng)只剩下一張票時(shí),線程 1賣出了最后一張票,接著要運(yùn)行 ticketNum,但在 ticketNum還沒來得及運(yùn)行的時(shí)候,線程 2有可能搶占 CPU,來判斷當(dāng)前有無票可賣,此時(shí),由于線程 1還沒有將 ticketNum,當(dāng)然票數(shù)還是 1,線程 2判斷還可以買票,這樣,最后一張票賣出了兩次。運(yùn)行,控制臺(tái)打印如下: 最后一張票被賣出兩次,系統(tǒng)不可靠。 以上案例是多個(gè)線程消費(fèi)有限資源的情況,該情況下還有很多其他案例,如:多個(gè)線程,向有限空間寫數(shù)據(jù)時(shí): ?線程 1寫完數(shù)據(jù),空間滿了,但沒來得及告訴系統(tǒng); ?此時(shí)另一個(gè)線程搶占 CPU,也來寫,不知道空間已滿,造成溢出。 有一種比較直觀的方法,可以在共享資源(如“票”)每一個(gè)對象內(nèi)部都增加一個(gè)新成員,標(biāo)識(shí)“票”是否正在被賣中,其他線程訪問時(shí),必須檢查這個(gè)標(biāo)識(shí),如果這個(gè)標(biāo)識(shí)確定票正在被賣中,線程不能搶占 CPU。這里以 Java語言為例,在 Java語言中, synchronized關(guān)鍵字可以解決這個(gè)問題,整個(gè)語法形式表現(xiàn)為: 注意, synchronized后的“同步鎖對象”,必須是可以被各個(gè)線程共享的,如 this、某個(gè)全局標(biāo)量等。在上面的例子中, this是一個(gè)“同步鎖對象”。 這說明程序運(yùn)行完全正常。若有,就必須等待。 實(shí)際上,在 Java內(nèi),還可以直接把 synchronized關(guān)鍵字直接加在函數(shù)的定義上,這也是一種可以推薦的方法。 線程協(xié)作安全 線程協(xié)作 有些情況下,多個(gè)線程合作 完成一件事情的幾個(gè)步驟,此時(shí)線程之間實(shí)現(xiàn)了協(xié)作。如:某個(gè)科學(xué)計(jì)算系統(tǒng)中,線程 1負(fù)責(zé)計(jì)算11000各個(gè)數(shù)字的和 (暫且認(rèn)為它非常耗時(shí) ),線程 2負(fù)責(zé)得到這個(gè)結(jié)果并且寫入數(shù)據(jù)庫。 該程序貌似沒有問題,也能夠打印正確結(jié)果,但是和上一節(jié)的例子一樣,它也是很不安全的,這種不安全性也很難發(fā)現(xiàn),也會(huì)給項(xiàng)目后期維護(hù)帶來巨大的代價(jià)。運(yùn)行,控制臺(tái)打印如下: 很顯然,這個(gè)結(jié)果不是我們所需要的。以 Java語言為例,在 Java語言中,線程的 join()方法可以解決這個(gè)問題。一般的方法是,可以將該工作放在另一個(gè)線程中,這樣,既不會(huì)堵塞主程序,又能夠保證數(shù)據(jù)安全性。如前面的“線程同步代碼段”,就是只能被一個(gè)線程使用的典型資源; ? 請求與保持條件:一個(gè)線程請求資源,但因?yàn)槟撤N原因,該資源無法分配給它,于是該線程阻塞,此時(shí),它對已獲得的資源保持不放; ? 不剝奪條件:進(jìn)程已獲得的資源,在未使用完之前,不管其是否阻塞,無法強(qiáng)行剝奪; ? 循環(huán)等待條件:若干進(jìn)程之間互相等待,形成一種頭尾相接的循環(huán)等待資源關(guān)系。如果出現(xiàn)一種極端情況,一個(gè)線程等候另一個(gè)對象,而另一個(gè)對象又在等候下一個(gè)對象,以此類推。但是和上一節(jié)的例子一樣,它也是很不安全的,這種不安全性也很難發(fā)現(xiàn)。將 該代碼中,增加了一行:程序休眠 1000毫秒,讓另一個(gè)線程來搶占CPU。 解決方案 就語言本身來說,尚未直接提供防止死鎖的幫助措施,需要我們通過謹(jǐn)慎的設(shè)計(jì)來避免。但可以通過 java thread dump來進(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è)地址上鎖,說明很可能死鎖發(fā)生了。 ? 從陷于死鎖的線程中逐個(gè)強(qiáng)迫放棄所占用的資源,直至死鎖消失。如: ? 數(shù)據(jù)庫死鎖。這將釋放所有與已經(jīng)結(jié)束的事務(wù)相關(guān)聯(lián)的鎖,至少允許其他連接中有一個(gè)可以獲取它們正在被阻塞的鎖。
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1