最近領(lǐng)導(dǎo)讓我在插件框架上加上一個接口隆圆,在宿主應(yīng)用中可以調(diào)用所有的插件去清除自己的緩存數(shù)據(jù),當(dāng)完成所有插件的清除任務(wù)后再執(zhí)行下一步操作。領(lǐng)導(dǎo)就是需求嘛冠场,領(lǐng)導(dǎo)改變注意那是再正常不過的事了秆剪,但是不是領(lǐng)導(dǎo)的需求人員有可能變多了會有人身危險赊淑。我平時和同事吹牛時,常和他們說工作的七字真言:
“不急仅讽、不怕、不要臉”(抄自馮唐)
我認(rèn)為對于軟件開發(fā)來說何什,這句話很值得品味组哩。在需求改變時,不要急于修改代碼处渣,而是要先做一個全盤的考慮伶贰,有些時候你還沒考慮好,需求方就說不要做了罐栈。在接到新任務(wù)或者遇到困難時不要怕黍衙,沒什么可怕的,你不難受你就不會有提高荠诬。最后琅翻,不要臉更是程序員最需要的位仁,這個自己體會。
面試題:如何處理線程同步的問題方椎?
有可能很多人對插件并不了解聂抢,不過沒關(guān)系,這個需求簡單地說就是主線程要等待多個子線程全部完成工作后棠众,才能繼續(xù)執(zhí)行琳疏。
說到多線程的同步問題,面試多的人應(yīng)該很容易被面試官問:Object的wait和notify/notifyAll如何實現(xiàn)線程同步闸拿?
在Object.java中空盼,定義了wait(), notify()和notifyAll()等接口。wait()的作用是讓當(dāng)前線程進(jìn)入等待狀態(tài)新荤,同時揽趾,wait()也會讓當(dāng)前線程釋放它所持有的鎖。而notify()和notifyAll()的作用苛骨,則是喚醒當(dāng)前對象上的等待線程但骨;notify()是喚醒單個線程,而notifyAll()是喚醒所有的線程智袭。
wait和yield(或sleep)的區(qū)別奔缠?
- wait()是讓線程由“運行狀態(tài)”進(jìn)入到“等待(阻塞)狀態(tài)”,而yield()是讓線程由“運行狀態(tài)”進(jìn)入到“就緒狀態(tài)”吼野,從而讓其它具有相同優(yōu)先級的等待線程獲取執(zhí)行權(quán)校哎;但是,并不能保證在當(dāng)前線程調(diào)用yield()之后瞳步,其它具有相同優(yōu)先級的線程就一定能獲得執(zhí)行權(quán)闷哆。
- wait()是會線程釋放它所持有對象的同步鎖,而yield()方法不會釋放鎖单起。
而我接觸到的很多情況是:問線程同步的問題抱怔,大多數(shù)人基本上只知道synchronized。
要搞清線程的同步問題嘀倒,大家要先了解一下“對象的同步鎖”撩匕,這個留給大家自己去看吧憔辫,這里不做展開。我們回到新接到的這個需求上來,這個場景其實挺合適做為一個面試題的卤妒。
如何實現(xiàn)呢楣导?我想到一個簡單的方法就是用CountDownLatch烦租。
CountDownLatch:一個同步輔助類(大名鼎鼎的java.util.concurrent包)豺鼻,在完成一組正在其他線程中執(zhí)行的操作之前,它允許一個或多個線程一直等待挨约。
用給定的任務(wù)數(shù)初始化CountDownLatch味混,一個線程工作完成(任務(wù)成功或者失敗都算工作完成)就調(diào)用 countDown() 方法产雹,當(dāng)計數(shù)到達(dá)零之前,await 方法會一直受阻塞翁锡。當(dāng)計數(shù)器為零時蔓挖,會釋放所有等待的線程,await后的代碼將被執(zhí)行盗誊。
CountDownLatch計數(shù)無法被重置。如果需要重置計數(shù)隘弊,請考慮使用 CyclicBarrier哈踱。
還有其他的實現(xiàn)方式嗎?這個是肯定的梨熙。比如开镣,真接上Thread.jion,代碼難看是會難看點咽扇,但也能完成這個需求邪财。
我還查到一種方式是使用java.util.concurrent.ExecutorService的awaitTermination阻塞主線程,等待線程池的所有線程執(zhí)行完成质欲。需要設(shè)置一個超時時間的參數(shù)树埠,如果超時則awaitTermination返回false,如果線程池中的線程全部執(zhí)行完成嘶伟,返回true怎憋。
小結(jié)
因為現(xiàn)在有很多開源的框架或者代碼庫,幫我們解決了很多底層諸如網(wǎng)絡(luò)請求九昧、線程池管理的問題绊袋,使得很多情況下我們都不怎么接觸到線程同步的問題。不過還有很有必要抽時間來學(xué)習(xí)一些線程同步的知識铸鹰,對我們提高并發(fā)編程的能力很有幫助癌别。
如果大家有更好的方式實現(xiàn)我開頭提到的需求,可以回帖一起討論一下蹋笼。
Even 原創(chuàng)
簡書鏈接:http://www.reibang.com/users/f9fbc7a39b36/latest_articles
轉(zhuǎn)載請注明出處展姐。