常用的并發(fā)編程技巧:
(1)永遠(yuǎn)在synchronized的方法或?qū)ο罄锸褂脀ait、notify和notifyAll,不然虛擬機(jī)會(huì)生成 IllegalMonitorStateException。
第一個(gè)問(wèn)題比較容易發(fā)現(xiàn)绪氛,往往在單測(cè)就可以暴露出問(wèn)題。
(2)始終使用while循環(huán)來(lái)調(diào)用wait方法(而非if),永遠(yuǎn)不要在循環(huán)外調(diào)用wait方法慎玖。這樣做的原因是盡管并不滿足被喚醒條件,但是由于其他線程調(diào)用notifyAll()方法會(huì)導(dǎo)致被阻塞線程意外喚醒笛粘,此時(shí)執(zhí)行條件并不滿足趁怔,他將破壞被鎖保護(hù)的約定關(guān)系,導(dǎo)致約束失效薪前,引起意想不到的結(jié)果润努。
第二個(gè)問(wèn)題需要切記,這個(gè)問(wèn)題往往會(huì)出現(xiàn)在剛接觸并發(fā)編程的開發(fā)者身上示括。
標(biāo)準(zhǔn)的使用方式
synchronized(this){ while(condition){ this.wait(); } }
(3)喚醒線程铺浇,應(yīng)該使用notify還是notifyAll?當(dāng)你不知道究竟該調(diào)用哪個(gè)方法時(shí)垛膝,保守的做法是調(diào)用notifyAll喚醒所有等待的線程鳍侣。從優(yōu)化的角度看丁稀,如果處于等待的所有線程都在等待同一個(gè)條件,而每次只有一個(gè)線程可以從這個(gè)條件中被喚醒倚聚,那么就應(yīng)該選擇調(diào)用notify线衫。