




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
線程應(yīng)用單元八目錄CONTENTS123多線程創(chuàng)建和使用線程線程控制線程死鎖和協(xié)作目錄CONTENTS5共享數(shù)據(jù)4publicclassShareData{staticintdata=0;publicstaticvoidmain(String[]args){ShareThreadlst1=newShareThread1();ShareThread2st2=newShareThread2();newThread(stl).start();newThread(st2).start();}//內(nèi)部類,訪問類中靜態(tài)成員變量dataprivatestaticclassShareThreadlimplementsRunnable{publicvoidrun(){while(data<10){try{Thread.sleep(l000);System.out.println("這個小于10的數(shù)據(jù)是:"+data++);}catch(InterruptedExceptione){e.printStackTrace();}}}}示例代碼:8.4.1數(shù)據(jù)不一致//內(nèi)部類,訪問類中靜態(tài)成員變量dataprivatestaticclassShareThread2implementsRunnable{publicvoidrun(){while(data<100){data++;}}}}
該案例說明當(dāng)一個數(shù)據(jù)被多個線程存取的時候,通過檢查這個數(shù)據(jù)的值來進(jìn)行判斷并執(zhí)行之后的操作是極不安全的。因?yàn)樵谂袛嘀?,這個數(shù)據(jù)的值很可能被其他線程修改了,判斷條件也可能已經(jīng)不成立了,但此時已經(jīng)經(jīng)過了判斷,之后的操作還需要繼續(xù)進(jìn)行。
8.4.2控制共享數(shù)據(jù)publicclassShareData2{staticintdata=0;//定義了一個鎖對象lockstaticfinalObjectlock=newObject();publicstaticvoidmain(String[]args){ShareThread1st1=newShareThread1();ShareThread2st2=newShareThread2();newThread(st1).start();newThread(st2).start();}示例代碼:privatestaticclassShareThread1implementsRunnable{publicvoidrun(){//對lock對象上鎖synchronized(lock){while(data<10){try{Thread.sleep(l000);System.out.println("這個小于10的數(shù)據(jù)是:"+data++);}catch(InterruptedExceptione){e.printStackTrace();}}}}}
Java提供了同步機(jī)制,來解決控制共享數(shù)據(jù)的問題,Java可以使用synchronized關(guān)鍵字確保數(shù)據(jù)在各個線程間正確共享。8.4.2控制共享數(shù)據(jù)privatestaticclassShareThread2implementsRunnable{publicvoidrun(){//對lock對象上鎖synchronized(lock){while(data<100){data++;}System.out.println("ShareThread2執(zhí)行完后data的值為:"+data);}}}}運(yùn)行結(jié)果8.4.3多線程同步
多線程同步依靠的是對象鎖機(jī)制,synchronized關(guān)鍵字就是利用鎖來實(shí)現(xiàn)對共享資源的互斥訪問。實(shí)現(xiàn)多線程同步的方法之一就是同步代碼塊,其語法形式如下:
synchronized(obj){
//同步代碼塊
}要想實(shí)現(xiàn)線程的同步,則這些線程必須去競爭一個唯一的共享的對象鎖。示例代碼:publicclassTestSyncThread{publicstaticvoidmain(String[]args){for(inti=0;i<5;i++){newThread(newSyncThread(i)).start();}}}classSyncThreadimplementsjava.lang.Runnable{privateinttid;publicSyncThread(intid){this.tid=id;}publicvoidrun(){for(inti=0;i<10;i++){System.out.println("線程ID名為:"+this.tid+"正在輸出:"+i);}}}8.4.3多線程同步publicclassTestSyncThread2{publicstaticvoidmain(String[]args){//創(chuàng)建一個線程之間競爭使用的對象Objectobj=newObject();for(inti=0;i<5;i++){newThread(newSyncThread(i,obj)).start();}}}示例代碼:classSyncThreadimplementsjava.lang.Runnable{privateinttid;privateObjectlock;//構(gòu)造方法引入競爭對象publicSyncThread(intid,Objectobj){this.tid=id;this.lock=obj;}
修改TestSyncThread類,在創(chuàng)建、啟動線程之前,先創(chuàng)建一個線程之間競爭使用的對象,然后將這個對象的引用傳遞給每一個線程對象的lock成員變量。8.4.3多線程同步publicvoidrun(){synchronized(lock){for(inti=0;i<10;i++){System.out.println("線程ID名為:"+this.tid+"正在輸出:"+i);}}}}運(yùn)行結(jié)果8.4.3多線程同步publicclassTestSyncThread3{publicstaticvoidmain(String[]args){for(inti=0;i<5;i++){NewThrea(newSyncThread(i).start();}}}ClassSyncThreadimplementsjava.lang.Runnable{Privateinttid;示例代碼://在線程類內(nèi)部定義一個靜態(tài)共享資源.lockprivatestaticObjectlock=newObject();publicSyncThread(intid){this.tid=id;}Publicvoidrun(){synchronized(lock){for(inti=0;i<10;i++){System.out.println("線程ID名為:"+this.tid+"正在輸出:"+i);}}}}
利用類變量被所有類的實(shí)例所共享這一特性,在線程類內(nèi)部定義一個靜態(tài)共享資源,通過對這個共享資源的競爭起到線程同步的目的。8.4.3多線程同步8.4.3多線程同步實(shí)現(xiàn)多線程同步的方法之二就是同步方法,其語法形式如下:
訪問修飾符synchronized返回類型方法名{
//同步方法體內(nèi)代碼塊
}每個類實(shí)例都對應(yīng)一把鎖,每個synchronized方法都必須獲得調(diào)用該方法的類實(shí)例的鎖方能執(zhí)行,否則所屬線程阻塞。synchronized方法一旦執(zhí)行,就獨(dú)占該鎖,直到該方法返回時才將鎖釋放,此后被阻塞的線程方能獲得該鎖,重新進(jìn)入就緒狀態(tài)。這種機(jī)制確保了同一時刻對于每一個類實(shí)例,其所有聲明為synchronized的方法中至多只有一個處于就緒狀態(tài),從而有效避免了類成員變量的訪問沖突。示例代碼:publicclassTestSyncThread4{publicstaticvoidmain(String[]args){for(inti=0;i<5;i++){newThread(newSyncThread(i)).startO;}}}classSyncThreadimplementsjava.lang.Runnable{privateinttid;publicSyncThread(intid){this.tid=id;}p
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025新風(fēng)系統(tǒng)購銷合同范本
- 2025年:探討合作原則下的租賃合同與違約責(zé)任研究
- 2025北京租賃合同模板
- 個人經(jīng)營合伙合同樣本
- 2025湖北省非全日制用工合同協(xié)議范本
- 2025人力資源外包合同書
- 公寓油煙隔絕方案范本
- 蜘蛛車專項(xiàng)施工方案
- 出租建筑用地合同標(biāo)準(zhǔn)文本
- 2025年上海市購銷合同范本購銷合同
- 變形監(jiān)測+數(shù)據(jù)整理+數(shù)據(jù)編制+科傻平差
- 機(jī)電安裝工程電氣現(xiàn)場監(jiān)理實(shí)施經(jīng)典PPT153頁
- 2022年度外經(jīng)貿(mào)發(fā)展專項(xiàng)資金管理辦法(最新版)政策法規(guī)
- 加拿大介紹-PPT課件
- 漢中市城鎮(zhèn)職工基本醫(yī)療保險門診慢性病申請鑒定表
- 每天堅持一小時體育鍛煉
- 鋁合金壓鑄件典型內(nèi)部缺陷
- 場地移交確認(rèn)書
- 河北省分公司聯(lián)通公司員工退出管理辦法(征求意見稿)
- 遼寧計價定額2008計算規(guī)則
- 專業(yè)技術(shù)人員競聘上崗量化評分表(共1頁)
評論
0/150
提交評論