




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Day13總結(jié)1、 單列設(shè)計(jì)模式:1、 惡漢式:代碼體現(xiàn):Class SinglePrivtae static final Single s=new Single();Private Single()Public static Single getInstance()Return s;2、 懶漢式:延遲加載,存在著多線程并發(fā)訪問(wèn)的安全問(wèn)題,需要使用同步來(lái)解決安全問(wèn)題,但是同步會(huì)降低效率,所以使用雙重if()判斷形式解決效率低的問(wèn)題。實(shí)現(xiàn)代碼:Class SinglePrivate Single()Private static Single s=null;Public static Single
2、 getInstance()If(s=null)Synchroinzed(Single.class)If(s=null)S=new Single();Return s;2、 死鎖:即同步的弊端,不是線程和進(jìn)程沒(méi)有了,而是不動(dòng)了。表現(xiàn)形式:同步嵌套的時(shí)候,使用的鎖不一樣,容易引發(fā)死鎖。實(shí)現(xiàn)代碼: 3、 線程間通信:其實(shí)就是多個(gè)線程在操作同一個(gè)資源,但是操作的動(dòng)作不同,動(dòng)作不同,意味著線程的任務(wù)是不一樣的。就需要對(duì)任務(wù)對(duì)象進(jìn)行單獨(dú)的封裝和描述。4、 等待喚醒機(jī)制:最重要的機(jī)制重點(diǎn)掌握Wait():等待:讓當(dāng)前線程出于凍結(jié)狀態(tài),當(dāng)前線程就被存儲(chǔ)到線程池當(dāng)中。Notify();喚醒線程池中的任意一個(gè)線
3、程,讓該線程恢復(fù)到運(yùn)行狀態(tài),會(huì)具備CPU的執(zhí)行資格。notifyAll():喚醒線程池中的所有等待的線程,讓它們具備CPU的執(zhí)行資格。所謂的監(jiān)視器:就是多線程中的鎖。上面幾個(gè)功能必須在同步當(dāng)中,要標(biāo)示清楚它所在的鎖。也就說(shuō):wait到底讓哪個(gè)鎖上的線程等待了,notify:到底是喚醒了哪個(gè)鎖上被等待的線程。NotifyAll:用上面的一樣。為什么是Object中的方法?因?yàn)檫@些方法都是必須要標(biāo)識(shí)出所屬的鎖,而鎖是任意的對(duì)象。能被任意對(duì)象調(diào)用的方法一定定義在Object類中。一般在使用等待和喚醒時(shí)通常都得有標(biāo)記。代碼優(yōu)化:ResourceDemo3.javaclass Resourcepriva
4、te String name;private String sex;private boolean flag = false;public synchronized void set(String name,String sex)if(flag)trythis.wait();catch(Exception e) = name;this.sex = sex;flag = true;this.notify();public synchronized void out()if(!flag)trythis.wait();catch(Exception e)System.out.pri
5、ntln(name+"-"+sex);flag = false;this.notify();class Input implements RunnableResource r;Input(Resource r)this.r = r;public void run()int x = 0;while (true)if(x=0)r.set("mike","nan");elser.set("麗麗","女女女女女");x = (x+1)%2;class Output implements Runnable
6、Resource r;Output(Resource r)this.r = r;public void run()while(true)r.out();class ResourceDemo3public static void main(String args) Resource r = new Resource();Input in = new Input(r);Output out = new Output(r);Thread t1 = new Thread(in);Thread t2 = new Thread(out);t1.start();t2.start();4、 生產(chǎn)者和消費(fèi)者問(wèn)題
7、: 遇到的問(wèn)題:1、 出現(xiàn)了錯(cuò)誤數(shù)據(jù),是因?yàn)槎嗌a(chǎn)多消費(fèi)的時(shí)候,被喚醒的線程沒(méi)有再次判斷標(biāo)記就執(zhí)行了,解決時(shí)將if判斷邊成while循環(huán)判斷,(這種方式是最安全的)2、 有了while判斷后死鎖了,因?yàn)楸痉骄€程喚醒的有可能還是本方線程,所以導(dǎo)致死鎖,解決:本方必須喚醒對(duì)放才有效,notify只能喚醒一個(gè), 還不確定,所以干脆喚醒所有的,肯定包含對(duì)象,至于被喚醒的本方會(huì)判斷標(biāo)記是否繼續(xù)等待。實(shí)現(xiàn)代碼:Class ResourcePrvate String name;Private int count;Private boolean flag;Private synchronized void s
8、et(String name)While(flag)TryThis.wait();Catch(Exception e)T=name+count;Count+;System.out.println(Thread.currentThread().getName()+".生產(chǎn)者"+)Flag=true;notifyAll();Public synchronized void out()While(!flag)Trythsi.wait();catch(Exception e)System.out.println(Thread.currentThre
9、ad().getName()+".消費(fèi)者"+);Flag=false;notifyAll();/喚醒所有的線程。Class Producer implements RunnablePrivate Resource r;Producer(Resource r)This.r=r;Public void run()While(true)R.set("商品");Class Consumer implements RunnablePrivate Resource r;Consumder(Resource r)This,r=r;Public voi
10、d run()While(true)R.out();Class ProConDemo/主函數(shù)Resource r=new Resource(0;Producer pro=new Producer(r);Consumer con=new Consumer(r);Thread t0=new Thread(pro);Thread t1=new Thread(pro);Thread t2=new Thread(con);Thread t3=new Thread(con);T0.start();T1.start();T2.start();T3.start();總結(jié):以上解決的方式還存折弊端,因?yàn)閱拘蚜怂?/p>
11、有的線程,但是如果喚醒了本方的,還是要進(jìn)行本方的判斷,這就會(huì)降低效率,所以這里我們?cè)趯W(xué)習(xí)一種可以避免這種情況的方法。Lock接口:JDK1.5版本后對(duì)多線程中的內(nèi)部細(xì)節(jié)進(jìn)行了升級(jí)改良,在java.util.concurrent.locks包中提供了一個(gè)lock接口。比同步應(yīng)用的更為廣泛,lock接口中提供了loc()獲取鎖,unlock釋放鎖的操作,這樣更符合面向?qū)ο蟮乃枷?,將鎖這種事物封裝成了對(duì)象。Eg:Public void run()Synchronized(obj)code.這種方式為隱式鎖機(jī)制,我們不能清楚的知道它里面是如何獲取鎖和釋放鎖的。Lock.lockPublic void
12、run()TryLock.lock();獲取鎖Code.Finally這里也是finally的用法的體現(xiàn),一定要執(zhí)行的代碼,常常用于關(guān)閉資源Lock.unlock();釋放鎖,實(shí)現(xiàn)代碼:import java.util.concurrent.locks.*;class Resourceprivate String name;/定義商品的名稱private int count;/定義計(jì)數(shù)器用來(lái)對(duì)商品進(jìn)行記錄private boolean flag;/定義一個(gè)標(biāo)記,用來(lái)控制多線程之間的狀態(tài)轉(zhuǎn)換。private Lock lock = new ReentrantLock();/用reentrantL
13、ock創(chuàng)建一個(gè)lock對(duì)象。private Condition con1 = lock.newCondition();/一組監(jiān)視器監(jiān)視生產(chǎn)者private Condition con2 = lock.newCondition();/一組監(jiān)視器監(jiān)視生產(chǎn)者public void set(String name)/lock.lock();/獲取鎖 .trywhile(flag)/判斷獲取了執(zhí)行的權(quán)的線程是否滿足要求,如果為false則不用捕獲異常。直接生產(chǎn)產(chǎn)品,如果為真,值捕獲異常,等待trycon1.await();catch(Exception e)/ (活) t1 (活)
14、 = name+count; /將生產(chǎn)的產(chǎn)品的名稱和記錄的數(shù)目賦值給namecount+;/生產(chǎn)的產(chǎn)品數(shù)自加System.out.println(Thread.currentThread().getName()+".生產(chǎn)者."+);/生產(chǎn)者 商品0 生產(chǎn)者 商品1 商品2獲取生產(chǎn)者生產(chǎn)的商品的名稱以及數(shù)值。flag = true;/執(zhí)行完打印之后通過(guò)flag標(biāo)記賦值來(lái)改變線程的狀態(tài)。con2.signal();/用到了新特性中的特點(diǎn)。Condition中的方法signal喚醒功能,當(dāng)前面加上對(duì)應(yīng)的控制比較時(shí),這樣就可以喚醒對(duì)方中的線程。也就是喚醒了消費(fèi)者中
15、的線程。這樣做的能提高效率,避免了上面那種方法中喚醒的如果是本方法中的線程對(duì)象。降低效率。finallylock.unlock();/釋放鎖。public void out()/ lock.lock();trywhile(!flag)trycon2.await();catch(Exception e)/t2 t3System.out.println(Thread.currentThread().getName()+".消費(fèi)者."+);/消費(fèi) 商品0flag = false;con1.signal();/喚醒生產(chǎn)者的線程、finallylock.unlock
16、();class Producer implements Runnableprivate Resource r;Producer(Resource r)this.r = r;public void run()while(true)r.set("商品");class Consumer implements Runnableprivate Resource r;Consumer(Resource r)this.r = r;public void run()while(true)r.out();class ProConDemo2 public static void main(String args) Resource r = new Resource();Producer pro = new Producer(r);Consumer con = new Consumer(r);Thread t0 = new Thread
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 強(qiáng)化核心統(tǒng)計(jì)概念2024年考試試題及答案
- 小學(xué)一年級(jí)語(yǔ)文考試整體試題及答案
- 全面解讀2024年食品質(zhì)檢員考試試題及答案
- 食品生物安全的關(guān)鍵措施試題及答案
- 二手車(chē)評(píng)估師考試客戶需求分析試題及答案
- 2024年二手車(chē)市場(chǎng)的轉(zhuǎn)型與發(fā)展試題及答案
- 2024年計(jì)算機(jī)基礎(chǔ)能力提升模式試題及答案
- 2024美容師考試準(zhǔn)備全景分析試題及答案
- 2024年藥理學(xué)考試親身心得的試題及答案
- 挖掘古代文學(xué)史考查要點(diǎn)試題及答案
- 浙江省溫州市2025屆高三下學(xué)3月二模試題 英語(yǔ) 南瓜雕刻比賽故事續(xù)寫(xiě) 講義
- 縣人民醫(yī)院開(kāi)展產(chǎn)前篩查技術(shù)服務(wù)可行性研究報(bào)告
- 小紅書(shū)運(yùn)營(yíng):小紅書(shū)賬號(hào)運(yùn)營(yíng)培訓(xùn)課件
- 2025年上半年上海青浦新城發(fā)展(集團(tuán))限公司自主招聘9名易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 墻紙墻布施工工藝標(biāo)準(zhǔn)化流程
- 《射雕英雄傳》好書(shū)讀后感
- DB51T 2049-2015 建筑消防設(shè)施檢測(cè)規(guī)范
- 部編版四年級(jí)語(yǔ)文下冊(cè)《親愛(ài)的漢修先生》整本書(shū)導(dǎo)讀課件(共38張PPT)
- 世界地理之歐洲西部
- 民辦教師人員花名冊(cè)
- 國(guó)家開(kāi)放大學(xué)《管理英語(yǔ)4》章節(jié)測(cè)試參考答案
評(píng)論
0/150
提交評(píng)論