多線程(最全面試題04)

Java實(shí)現(xiàn)線程有哪幾種方式浪讳?
1、繼承Thread類實(shí)現(xiàn)多線程
2祠锣、實(shí)現(xiàn)Runnable接口方式實(shí)現(xiàn)多線程
3、使用ExecutorService咽安、Callable伴网、Future實(shí)現(xiàn)有返回結(jié)果的多線程

多線程同步有哪幾種方法?

Synchronized關(guān)鍵字妆棒,Lock鎖實(shí)現(xiàn)是偷,分布式鎖等。
Runnable和Thread用哪個(gè)好募逞?
Java不支持類的多重繼承,但允許你實(shí)現(xiàn)多個(gè)接口馋评。所以如果你要繼承其他類放接,也為了減少類之間的耦合性,Runnable會(huì)更好留特。

Java中notify和notifyAll有什么區(qū)別纠脾?
notify()方法不能喚醒某個(gè)具體的線程,所以只有一個(gè)線程在等待的時(shí)候它才有用武之地蜕青。而notifyAll()喚醒所有線程并允許他們爭奪鎖確保了至少有一個(gè)線程能繼續(xù)運(yùn)行苟蹈。

為什么wait/notify/notifyAll這些方法不在thread類里面?
這是個(gè)設(shè)計(jì)相關(guān)的問題右核,它考察的是面試者對現(xiàn)有系統(tǒng)和一些普遍存在但看起來不合理的事物的看法慧脱。回答這些問題的時(shí)候贺喝,你要說明為什么把這些方法放在Object類里是有意義的菱鸥,還有不把它放在Thread類里的原因。一個(gè)很明顯的原因是JAVA提供的鎖是對象級(jí)的而不是線程級(jí)的躏鱼,每個(gè)對象都有鎖氮采,通過線程獲得。如果線程需要等待某些鎖那么調(diào)用對象中的wait()方法就有意義了染苛。如果wait()方法定義在Thread類中鹊漠,線程正在等待的是哪個(gè)鎖就不明顯了。簡單的說,由于wait躯概,notify和notifyAll都是鎖級(jí)別的操作登钥,所以把他們定義在Object類中因?yàn)殒i屬于對象。
為什么wait和notify方法要在同步塊中調(diào)用楞陷?
主要是因?yàn)镴ava API強(qiáng)制要求這樣做怔鳖,如果你不這么做,你的代碼會(huì)拋出IllegalMonitorStateException異常固蛾。還有一個(gè)原因是為了避免wait和notify之間產(chǎn)生競態(tài)條件结执。
什么是死鎖?如何避免死鎖艾凯?
死鎖就是兩個(gè)線程相互等待對方釋放對象鎖献幔。
啟動(dòng)線程方法start()和run()有什么區(qū)別?
只有調(diào)用了start()方法趾诗,才會(huì)表現(xiàn)出多線程的特性蜡感,不同線程的run()方法里面的代碼交替執(zhí)行。如果只是調(diào)用run()方法恃泪,那么代碼還是同步執(zhí)行的郑兴,必須等待一個(gè)線程的run()方法里面的代碼全部執(zhí)行完畢之后,另外一個(gè)線程才可以執(zhí)行其run()方法里面的代碼贝乎。

多線程之間如何進(jìn)行通信情连?
wait/notify
什么是線程池?
很簡單览效,簡單看名字就知道是裝有線程的池子却舀,我們可以把要執(zhí)行的多線程交給線程池來處理,和連接池的概念一樣锤灿,通過維護(hù)一定數(shù)量的線程池來達(dá)到多個(gè)線程的復(fù)用挽拔。
線程池的好處
我們知道不用線程池的話,每個(gè)線程都要通過new Thread(xxRunnable).start()的方式來創(chuàng)建并運(yùn)行一個(gè)線程但校,線程少的話這不會(huì)是問題螃诅,而真實(shí)環(huán)境可能會(huì)開啟多個(gè)線程讓系統(tǒng)和程序達(dá)到最佳效率,當(dāng)線程數(shù)達(dá)到一定數(shù)量就會(huì)耗盡系統(tǒng)的CPU和內(nèi)存資源状囱,也會(huì)造成GC頻繁收集和停頓州刽,因?yàn)槊看蝿?chuàng)建和銷毀一個(gè)線程都是要消耗系統(tǒng)資源的,如果為每個(gè)任務(wù)都創(chuàng)建線程這無疑是一個(gè)很大的性能瓶頸浪箭。所以穗椅,線程池中的線程復(fù)用極大節(jié)省了系統(tǒng)資源,當(dāng)線程一段時(shí)間不再有任務(wù)處理時(shí)它也會(huì)自動(dòng)銷毀奶栖,而不會(huì)長駐內(nèi)存匹表。

什么是活鎖门坷、饑餓、無鎖袍镀、死鎖默蚌?
死鎖、活鎖苇羡、饑餓是關(guān)于多線程是否活躍出現(xiàn)的運(yùn)行阻塞障礙問題绸吸,如果線程出現(xiàn)了這三種情況,即線程不再活躍设江,不能再正常地執(zhí)行下去了锦茁。
死鎖
死鎖是多線程中最差的一種情況,多個(gè)線程相互占用對方的資源的鎖叉存,而又相互等對方釋放鎖码俩,此時(shí)若無外力干預(yù),這些線程則一直處理阻塞的假死狀態(tài)歼捏,形成死鎖稿存。
舉個(gè)例子,A同學(xué)搶了B同學(xué)的鋼筆瞳秽,B同學(xué)搶了A同學(xué)的書瓣履,兩個(gè)人都相互占用對方的東西,都在讓對方先還給自己自己再還练俐,這樣一直爭執(zhí)下去等待對方還而又得不到解決袖迎,老師知道此事后就讓他們相互還給對方,這樣在外力的干預(yù)下他們才解決痰洒,當(dāng)然這只是個(gè)例子沒有老師他們也能很好解決,計(jì)算機(jī)不像人如果發(fā)現(xiàn)這種情況沒有外力干預(yù)還是會(huì)一直阻塞下去的浴韭。
活鎖
活鎖這個(gè)概念大家應(yīng)該很少有人聽說或理解它的概念丘喻,而在多線程中這確實(shí)存在∧罹保活鎖恰恰與死鎖相反泉粉,死鎖是大家都拿不到資源都占用著對方的資源,而活鎖是拿到資源卻又相互釋放不執(zhí)行榴芳。當(dāng)多線程中出現(xiàn)了相互謙讓嗡靡,都主動(dòng)將資源釋放給別的線程使用,這樣這個(gè)資源在多個(gè)線程之間跳動(dòng)而又得不到執(zhí)行窟感,這就是活鎖讨彼。
饑餓
我們知道多線程執(zhí)行中有線程優(yōu)先級(jí)這個(gè)東西,優(yōu)先級(jí)高的線程能夠插隊(duì)并優(yōu)先執(zhí)行柿祈,這樣如果優(yōu)先級(jí)高的線程一直搶占優(yōu)先級(jí)低線程的資源哈误,導(dǎo)致低優(yōu)先級(jí)線程無法得到執(zhí)行哩至,這就是饑餓。當(dāng)然還有一種饑餓的情況蜜自,一個(gè)線程一直占著一個(gè)資源不放而導(dǎo)致其他線程得不到執(zhí)行菩貌,與死鎖不同的是饑餓在以后一段時(shí)間內(nèi)還是能夠得到執(zhí)行的,如那個(gè)占用資源的線程結(jié)束了并釋放了資源重荠。
無鎖
無鎖箭阶,即沒有對資源進(jìn)行鎖定,即所有的線程都能訪問并修改同一個(gè)資源戈鲁,但同時(shí)只有一個(gè)線程能修改成功仇参。無鎖典型的特點(diǎn)就是一個(gè)修改操作在一個(gè)循環(huán)內(nèi)進(jìn)行,線程會(huì)不斷的嘗試修改共享資源荞彼,如果沒有沖突就修改成功并退出否則就會(huì)繼續(xù)下一次循環(huán)嘗試冈敛。所以,如果有多個(gè)線程修改同一個(gè)值必定會(huì)有一個(gè)線程能修改成功鸣皂,而其他修改失敗的線程會(huì)不斷重試直到修改成功抓谴。之前的文章我介紹過JDK的CAS原理及應(yīng)用即是無鎖的實(shí)現(xiàn)。
可以看出寞缝,無鎖是一種非常良好的設(shè)計(jì)癌压,它不會(huì)出現(xiàn)線程出現(xiàn)的跳躍性問題,鎖使用不當(dāng)肯定會(huì)出現(xiàn)系統(tǒng)性能問題荆陆,雖然無鎖無法全面代替有鎖滩届,但無鎖在某些場合下是非常高效的。
Synchronized有哪幾種用法被啼?
鎖類帜消、鎖方法、鎖代碼塊浓体。
Fork/Join框架是干什么的泡挺?
大任務(wù)自動(dòng)分散小任務(wù),并發(fā)執(zhí)行命浴,合并小任務(wù)結(jié)果娄猫。
Java中用到了什么線程調(diào)度算法?
搶占式生闲。一個(gè)線程用完CPU之后媳溺,操作系統(tǒng)會(huì)根據(jù)線程優(yōu)先級(jí)、線程饑餓情況等數(shù)據(jù)算出一個(gè)總的優(yōu)先級(jí)并分配下一個(gè)時(shí)間片給某個(gè)線程執(zhí)行碍讯。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末悬蔽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子捉兴,更是在濱河造成了極大的恐慌屯阀,老刑警劉巖缅帘,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異难衰,居然都是意外死亡钦无,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門盖袭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來失暂,“玉大人,你說我怎么就攤上這事鳄虱〉苋” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵拙已,是天一觀的道長决记。 經(jīng)常有香客問我,道長倍踪,這世上最難降的妖魔是什么系宫? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮建车,結(jié)果婚禮上扩借,老公的妹妹穿的比我還像新娘。我一直安慰自己缤至,他們只是感情好潮罪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著领斥,像睡著了一般嫉到。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上月洛,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天何恶,我揣著相機(jī)與錄音,去河邊找鬼膊存。 笑死导而,一個(gè)胖子當(dāng)著我的面吹牛忱叭,可吹牛的內(nèi)容都是我干的隔崎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼韵丑,長吁一口氣:“原來是場噩夢啊……” “哼爵卒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起撵彻,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤钓株,失蹤者是張志新(化名)和其女友劉穎实牡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體轴合,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡创坞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了受葛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片题涨。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖总滩,靈堂內(nèi)的尸體忽然破棺而出纲堵,到底是詐尸還是另有隱情,我是刑警寧澤闰渔,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布席函,位于F島的核電站,受9級(jí)特大地震影響冈涧,放射性物質(zhì)發(fā)生泄漏茂附。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一炕舵、第九天 我趴在偏房一處隱蔽的房頂上張望何之。 院中可真熱鬧,春花似錦咽筋、人聲如沸溶推。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蒜危。三九已至,卻和暖如春睹耐,著一層夾襖步出監(jiān)牢的瞬間辐赞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工硝训, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留响委,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓窖梁,卻偏偏與公主長得像赘风,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子纵刘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

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

  • 1.解決信號(hào)量丟失和假喚醒 public class MyWaitNotify3{ MonitorObject m...
    Q羅閱讀 878評論 0 1
  • Java多線程學(xué)習(xí) [-] 一擴(kuò)展javalangThread類 二實(shí)現(xiàn)javalangRunnable接口 三T...
    影馳閱讀 2,957評論 1 18
  • 本文主要講了java中多線程的使用方法邀窃、線程同步、線程數(shù)據(jù)傳遞假哎、線程狀態(tài)及相應(yīng)的一些線程函數(shù)用法瞬捕、概述等鞍历。 首先講...
    李欣陽閱讀 2,454評論 1 15
  • Java-Review-Note——4.多線程 標(biāo)簽: JavaStudy PS:本來是分開三篇的,后來想想還是整...
    coder_pig閱讀 1,648評論 2 17
  • 林炳文Evankaka原創(chuàng)作品肪虎。轉(zhuǎn)載自http://blog.csdn.net/evankaka 本文主要講了ja...
    ccq_inori閱讀 654評論 0 4