Android面試一天一題(16 Day: 線程同步)

最近領(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ū)別奔缠?

  1. 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)闷哆。
  1. 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)載請注明出處展姐。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市剖毯,隨后出現(xiàn)的幾起案子诞仓,更是在濱河造成了極大的恐慌,老刑警劉巖速兔,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件墅拭,死亡現(xiàn)場離奇詭異,居然都是意外死亡涣狗,警方通過查閱死者的電腦和手機谍婉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門舒憾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人穗熬,你說我怎么就攤上這事镀迂。” “怎么了唤蔗?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵探遵,是天一觀的道長。 經(jīng)常有香客問我妓柜,道長箱季,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任棍掐,我火速辦了婚禮藏雏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘作煌。我一直安慰自己掘殴,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布粟誓。 她就那樣靜靜地躺著奏寨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鹰服。 梳的紋絲不亂的頭發(fā)上服爷,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機與錄音获诈,去河邊找鬼仍源。 笑死,一個胖子當(dāng)著我的面吹牛舔涎,可吹牛的內(nèi)容都是我干的笼踩。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼亡嫌,長吁一口氣:“原來是場噩夢啊……” “哼嚎于!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起挟冠,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤于购,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后知染,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肋僧,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了嫌吠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片止潘。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖辫诅,靈堂內(nèi)的尸體忽然破棺而出凭戴,到底是詐尸還是另有隱情,我是刑警寧澤炕矮,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布么夫,位于F島的核電站,受9級特大地震影響肤视,放射性物質(zhì)發(fā)生泄漏档痪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一钢颂、第九天 我趴在偏房一處隱蔽的房頂上張望钞它。 院中可真熱鬧拜银,春花似錦殊鞭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至泵督,卻和暖如春趾盐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背小腊。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工救鲤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秩冈。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓本缠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親入问。 傳聞我的和親對象是個殘疾皇子丹锹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 下面是我自己收集整理的Java線程相關(guān)的面試題,可以用它來好好準(zhǔn)備面試芬失。 參考文檔:-《Java核心技術(shù) 卷一》-...
    阿呆變Geek閱讀 14,766評論 14 507
  • 本文出自 Eddy Wiki 楣黍,轉(zhuǎn)載請注明出處:http://eddy.wiki/interview-java.h...
    eddy_wiki閱讀 2,076評論 0 14
  • 不管你是新程序員還是老手,你一定在面試中遇到過有關(guān)線程的問題棱烂。Java語言一個重要的特點就是內(nèi)置了對并發(fā)的支持租漂,讓...
    堯淳閱讀 1,590評論 0 25
  • 真是喜歡這段話 Leave egotism and personaj agendas at the door. T...
    柳濤虹閱讀 227評論 0 3
  • 歌曲《從前慢》中有句歌詞 從前的月色變得慢 車 馬 郵件都慢 一生只夠 愛一個人 。。窜锯。 多美的臺詞张肾,令我心旌搖曳...
    一水輕塵閱讀 384評論 0 1