多線程第2天線安全、同步等待機(jī)制單例設(shè)計(jì)模式_第1頁
多線程第2天線安全、同步等待機(jī)制單例設(shè)計(jì)模式_第2頁
多線程第2天線安全、同步等待機(jī)制單例設(shè)計(jì)模式_第3頁
多線程第2天線安全、同步等待機(jī)制單例設(shè)計(jì)模式_第4頁
多線程第2天線安全、同步等待機(jī)制單例設(shè)計(jì)模式_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

19線今日內(nèi)容介Lock第1章多線院要賣票,我們模擬院的賣票過程。假設(shè)要的是“功夫熊貓3”,本次的座位共100個(gè)(本場只能賣100張票)。100張票)需要窗口,采用線程對(duì)象來模擬;需要票,RunnablepublicpublicclassThreadDemopublicstaticvoidmain(String[]args)Ticketticket=newThreadt1=newThread(ticketThreadThreadt2=newThread(ticket2");Threadt3=newThread(ticket}}publicpublicclassTicketimplementsRunnableintticket=publicvoidrun()if(ticket>0)try{}catch(InterruptedExceptione){}System.out.println(Thread.currentThread().getName()+"正在賣票+ticket--}}}}0、-其實(shí),線程安全問題都是由全局變量及靜態(tài)變量引起的。若每個(gè)線程中對(duì)全局變量、靜態(tài)變作,一般都需要考慮線程同步,否則的話就可能影響線程安全。線程同步(線程安全處理java中提供了線程同步機(jī)制,它能夠解決上述的線程安全問題。同步代synchronized鎖對(duì)象}同步代碼塊:synchronized鎖對(duì)象}程安全。使用同步代碼塊,對(duì)院賣票案例中Ticket類進(jìn)行如下代碼修改publicpublicclassTicketimplementsRunnableintticket=Objectlock=newObject();publicvoidrun()synchronized(lock){if(ticket>0) 選坐的操try}catch(InterruptedExceptione){}System.out.println(Thread.currentThread().getName()+"票ticket}}}}}同步方同步方法:在方法上加上publicpublicsynchronizedvoid}同步方法中的鎖對(duì)象是publicpublicclassTicketimplementsRunnableintticket=Objectlock=newObject();publicvoidrun()}}publicsynchronizedvoidif(ticket>0)try}catch(InterruptedExceptione){}System.out.println(Thread.currentThread().getName()+"正在賣票:"+}}}靜態(tài)同步方法:在方法上加上staticpublicpublicstaticsynchronizedvoid}靜態(tài)同步方法中的鎖對(duì)象是類名synchronzied(A鎖){}}synchronzied(A鎖){}}publicpublicclassMyLockpublicstaticfinalObjectlockA=newpublicstaticfinalObjectlockB=new}publicpublicclassThreadTaskimplementsRunnableintx=newpublicvoidrun()if(x%2==0)synchronized(MyLock.lockA){synchronized(MyLock.lockB){}}}elsesynchronized(MyLock.lockB){synchronized(MyLock.lockA){}}}}}publicpublicclassThreadDemopublicstaticvoidmain(String[]args)ThreadTasktask=newThreadt1=newThread(task);Threadt2=new}}LockLock提供了一個(gè)更加面對(duì)對(duì)象的鎖,在該鎖中提供了的操作鎖的功能我們使用Lock接口以及其中的lock()方法和unlock()方法替代同步對(duì)院賣票案例中publicpublicclassTicketimplementsRunnableintticket=Lockck=newpublicvoidrun()//synchronized//synchronized(lock){if(ticket>0)try{}catch(InterruptedExceptione){}System.out.println(Thread.currentThread().getName()+"票ticket}}}}一個(gè)資源,但是處理的動(dòng)作(線程的任務(wù))卻不相同。通過一定的使各個(gè)線程能有效的利用資源。而這種即——等待喚醒機(jī)制。wait():等待,將正在執(zhí)行的線程釋放其執(zhí)行資格和執(zhí)行權(quán),并到線程池中:喚醒,喚醒線程池中被notifyAll():wait()JavaAPIThreadRunnable接口中,ObjectObject類中?Object類中。接下里,我們先從一個(gè)簡單的示例入手 ,輸出線程從資源中輸出,先要完成的任1.inputResourceoutputwait();inputpublicclasspublicclassResource{privateStringname;privateString privatebooleanflag=publicsynchronizedvoidset(Stringname,iftry}catch(InterruptedExceptione){}=) 設(shè)置之后,Resourcetrueflag=true;}publicsynchronizedvoidout()iftrytry}catch(InterruptedExceptione){} :"+name+ :"flag=}}publicpublicclassInputimplementsRunnableprivateResourcepublicInput(Resourcer){this.r=r;}publicvoidrun(){intcount=0;while(true){if(count==0)}else}男生",count=(count+1)%}}}publicpublicclassOutputimplementsRunnable{privateResourcer;publicOutput(Resourcer){this.r=r;}publicvoidrun(){while(true){}}}publicpublicclassResourceDemopublicstaticvoidmain(String[]args)Resourcer=newInputin=newInput(r);Outputout=newOutput(r);Threadt1=newThread(in);Threadt2=newThread(out);}}查閱API關(guān)于IllegalThreadStateException這個(gè)異常說明信息發(fā)現(xiàn),這個(gè)異常的描述信息為:指示第2章單例設(shè)計(jì)模單例模式是設(shè)計(jì)模式中最簡單的形式之一。這一模式的目的是使得類的一個(gè)對(duì)象成為系統(tǒng)中的唯一實(shí)例要實(shí)現(xiàn)這一點(diǎn)需要用一種只允許生成對(duì)象類的唯一實(shí)例的機(jī)制“所有想要生成對(duì)象的。這個(gè)方法應(yīng)該是靜態(tài)方法(類方法,因?yàn)樽岊惖膶?shí)例去生成另一個(gè)唯一實(shí)例毫無意義。提供一個(gè)公共的方法讓外界,獲取到已創(chuàng)建的本類對(duì)象::當(dāng)需要用到對(duì)象的時(shí)候,再創(chuàng)建對(duì)象(延遲加載方式)多個(gè)線程對(duì)象的時(shí)候,這種方式線程是不安全,保證類在內(nèi)存中只有一個(gè)對(duì)象[餓漢式:直接創(chuàng)建對(duì)象publicpublicclassSonprivatestaticSons=newprivateSon(){} ,獲取到已創(chuàng)建的本類對(duì)publicpublicstaticSongetInstance(){returns;}}publicpublicclassSinglePatternDemopublicstaticvoidmain(String[]args)throwsIOException{Sons1=Son.getInstance();Sons2=Son.getInstance();}}publicpublicclassGirlprivatestaticGirlg=privateGirl(){} ,獲取到已創(chuàng)建的本類對(duì) 該方法,創(chuàng)建對(duì) 該方法,返回以前創(chuàng)建好的對(duì)publicstaticGirl 該方法,創(chuàng)建對(duì)if(g==null)g=new} 該方法,返回以前創(chuàng)建好的對(duì)return}}publicpublicclassSinglePatternDemopublicstaticvoidmain(String[]args)throwsIOExceptionGirlg1Girl.getInstance();Girlg2Girl.getInstance();newThread(){publicvoidrun()Girlg=Girl.getInstance();}newThread(){publicvoidrun()Girlg=Girl.getInstance();}}}publicpublicclassGirlprivatestaticGirlg=privateGirl(){} ,獲取到已創(chuàng)建的本類對(duì) 該方法,創(chuàng)建對(duì) 該方法,返回以前創(chuàng)建好的對(duì)publicstaticGirl 該方法,創(chuàng)建對(duì)if(g==null){if(g==null)g=new}}} 該方法,返回以前創(chuàng)建好的對(duì)returnreturn}}publicpublicclassSinglePatternDemopublicstaticvoidmain(String[]args)throwsIOExceptionGirlg1Girl.getInstance();Girlg2Girl.getInstance();newThread(){publicvoidrun()Girlg=Girl.getInstance();}newThread(){publicvoidrun()Girlg=Girl.getInstance();}}}第3章總synchronizeds

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論