更新時(shí)間:2020-02-06 16:42:45 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽3397次

進(jìn)程與線程的區(qū)別
進(jìn)程是資源分配的最小單位,線程是CPU調(diào)度的最小單位
所有與進(jìn)程相關(guān)的資源,都被記錄在PCB(進(jìn)程控制塊)中
進(jìn)程是搶占處理機(jī)的調(diào)度單位;線程屬于某個(gè)進(jìn)程,共享其資源
線程只由堆棧寄存器、程序計(jì)數(shù)器和TCB(線程控制塊)組成
總結(jié):
線程不能看做獨(dú)立應(yīng)用,而進(jìn)程可看做獨(dú)立應(yīng)用
進(jìn)程有獨(dú)立的地址空間,相互不影響,線程只是進(jìn)程的不同執(zhí)行路徑
線程沒(méi)有獨(dú)立的地址空間,多進(jìn)程的程序比多線程的程序健壯
進(jìn)程的開(kāi)銷比線程大,切換代價(jià)高
Java進(jìn)程和線程的關(guān)系
Java對(duì)操作系統(tǒng)的功能進(jìn)行封裝,包括進(jìn)程和線程
運(yùn)行一個(gè)程序會(huì)產(chǎn)生一個(gè)進(jìn)程,進(jìn)程包含至少一個(gè)線程
每個(gè)進(jìn)程對(duì)應(yīng)一個(gè)JVM實(shí)例,多個(gè)線程共享JVM里的堆
Java采用單線程編程模型,程序會(huì)自動(dòng)創(chuàng)建主線程
主線程可以創(chuàng)建子線程,原則上要后于子線程完成執(zhí)行
start和run的區(qū)別
調(diào)用start()方法會(huì)創(chuàng)建一個(gè)新的子線程并啟動(dòng)
run()方法只是Thread的一個(gè)普通方法的調(diào)用(注:還是在主線程里面執(zhí)行)
Thread和Runnable
Thread是實(shí)現(xiàn)了Runnable接口的類,使得run支持多線程
publicclassThreadimplementsRunnable
因?yàn)轭惖膯我焕^承原則,推薦多使用Runnable接口
如何給run()方法傳參
實(shí)現(xiàn)方式有三種
構(gòu)造函數(shù)傳參
成員變量傳參
回調(diào)函數(shù)傳參
如何實(shí)現(xiàn)處理線程的返回值
實(shí)現(xiàn)的方式主要有三種:
主線程等待法
使用Thread類的join()阻塞當(dāng)前線程以等待子線程處理完畢
通過(guò)Callable接口實(shí)現(xiàn):通過(guò)FutureOr線程池獲取
Java線程的六個(gè)狀態(tài)
新建(New):創(chuàng)建后尚未啟動(dòng)的線程的狀態(tài)
運(yùn)行(Runnable):包含Running和Ready
無(wú)限期等待(Waiting):不會(huì)被分配CPU執(zhí)行時(shí)間,需要顯示被喚醒
限期等待(TimedWaiting):在一定時(shí)間后會(huì)由系統(tǒng)自動(dòng)喚醒
阻塞(Blocked):等待獲取排它鎖
結(jié)束(Terminated):已終止線程的狀態(tài),線程已經(jīng)結(jié)束執(zhí)行
Sleep和wait的區(qū)別
sleep是Thread的方法,wait是Object類中定義的方法
sleep()方法可以在任何地方使用
wait()方法只能在synchronized方法或synchronized塊中使用
Thread.sleep只會(huì)讓出CPU,不會(huì)導(dǎo)致鎖行為的改變
Object.wait不僅讓出CPU,還會(huì)釋放已經(jīng)占有的同步資源鎖
notify和notifyAll的區(qū)別
鎖池EntryList:假設(shè)線程A已經(jīng)獲得了某個(gè)對(duì)象(不是類)的鎖,而其他線程B,C想要調(diào)用這個(gè)對(duì)象的某個(gè)synchronized方法(或者塊),由于B,C線程在進(jìn)入對(duì)象的synchronized方法之前必須獲得該對(duì)象鎖的擁有權(quán),而恰巧該對(duì)象的鎖剛好被線程A所占用,此時(shí)B,C線程就會(huì)被阻塞,進(jìn)入一個(gè)地方去等待鎖的釋放,這個(gè)地方就是鎖池。
等待池WaitSet:假設(shè)線程A調(diào)用了某個(gè)對(duì)象的wait()方法,線程A就會(huì)釋放該對(duì)象的鎖,同時(shí)線程A就進(jìn)入到了該對(duì)象的等待池中,進(jìn)入到等待池中的線程不會(huì)去競(jìng)爭(zhēng)該對(duì)象的鎖。
notifyAll會(huì)讓所有出于等待池WaitSet的線程全部進(jìn)入鎖池EntryList去競(jìng)爭(zhēng)獲取鎖的機(jī)會(huì)
notify只會(huì)隨機(jī)選取一個(gè)處于等待池中的線程進(jìn)入鎖池去競(jìng)爭(zhēng)獲取鎖的機(jī)會(huì)
Yield與join的區(qū)別
當(dāng)調(diào)用Thread.yeild()函數(shù)時(shí),會(huì)給線程調(diào)度器一個(gè)當(dāng)前線程愿意讓出CPU使用的暗示,但是線程調(diào)度器可能會(huì)忽略這個(gè)暗示。并不會(huì)讓出當(dāng)前線程的鎖。
yield是一個(gè)靜態(tài)的原生(native)方法
yield不能保證是的當(dāng)前正在運(yùn)行的線程迅速轉(zhuǎn)換到可運(yùn)行的狀態(tài),僅能從運(yùn)行態(tài)轉(zhuǎn)換到可運(yùn)行態(tài),而不能是等待或阻塞。
join方法可以使得一個(gè)線程在另一個(gè)線程結(jié)束后再執(zhí)行。當(dāng)前線程將阻塞直到這個(gè)線程實(shí)例完成了再執(zhí)行。
join方法可設(shè)置超時(shí),使得join()方法的影響在特定超時(shí)后無(wú)效,如,join(50)。注:join(0),并不是等待0秒,而是等待無(wú)限時(shí)間,等價(jià)join()。
-join方法必須在線程start()方法調(diào)用之后才有意義
join方法的原理,就是調(diào)用了相應(yīng)線程的wait方法
如何中斷線程
已經(jīng)被拋棄的方法:
通過(guò)調(diào)用stop()方法停止線層(原因:不安全,會(huì)釋放掉鎖)
通過(guò)調(diào)用suspend()和resume()方法
目前使用的方法:
調(diào)用interrput(),通知線程應(yīng)該中斷了:1.如果線程出于被阻塞的狀態(tài),那么線程將立即退出被阻塞狀態(tài),并拋出一個(gè)InterruputedException異常。2.如果線程出于正常的活動(dòng)狀態(tài),那么會(huì)將該線程的中斷標(biāo)志設(shè)置為true。被設(shè)置中斷標(biāo)志的線程將繼續(xù)正常運(yùn)行,不受影響。
需要被調(diào)用的線程配合中斷:1.在正常運(yùn)行任務(wù)時(shí),經(jīng)常檢查本線程的中斷標(biāo)志位,如果被設(shè)置了中斷標(biāo)志就自行停止線程。2.如果線程處于正?;顒?dòng)狀態(tài),那么會(huì)將該線程的中斷標(biāo)志設(shè)置為true。被設(shè)置中斷標(biāo)志的線程將繼續(xù)正常運(yùn)行,不受影響。
Synchronized
線程安全出現(xiàn)的原因:
存在共享數(shù)據(jù)(也稱為臨界資源)
存在多線程共同操作這些共享數(shù)據(jù)
解決線程安全的根本辦法:同一時(shí)刻有且只有一個(gè)線程在操作共享數(shù)據(jù),其他線程必須等到該線程處理完數(shù)據(jù)之后再對(duì)共享數(shù)據(jù)進(jìn)行操作,引入了互斥鎖
互斥鎖的特性:
互斥性:即在同一個(gè)時(shí)間只允許一個(gè)線程持有某個(gè)對(duì)象鎖,通過(guò)這種特性來(lái)實(shí)現(xiàn)多線程的協(xié)調(diào)機(jī)制,這樣在同一時(shí)間只有一個(gè)線程對(duì)需要同步的代碼塊(復(fù)合操作)進(jìn)行訪問(wèn)。互斥性也成為操作的原子性。
可見(jiàn)性:必須確保在鎖被釋放之前,對(duì)共享變量所做的修改,對(duì)于隨后獲得該鎖的另一個(gè)線程是可見(jiàn)的(即在獲得鎖時(shí)應(yīng)獲得最新的共享變量的值),否則另一個(gè)線程可能是在本地緩存的某個(gè)副本上繼續(xù)操作,從而引起不一致性。
synchronized鎖的不是代碼,是對(duì)象。
根據(jù)獲取的鎖分類:
獲取對(duì)象鎖:1、同步代碼塊(synchronized(this),synchronized(類實(shí)例對(duì)象)),鎖是小括號(hào)()中的實(shí)例對(duì)象。2、同步非靜態(tài)方法(synchronizedmethod),鎖是當(dāng)前對(duì)象的實(shí)例對(duì)象。
獲取類鎖:1、同步代碼塊(synchronized(類.class)),鎖是小括號(hào)()中的類對(duì)象(class對(duì)象)。2、同步靜態(tài)方法(synchronizedstaticmethod),鎖是當(dāng)前對(duì)象的類對(duì)象(class對(duì)象)。
有線程訪問(wèn)對(duì)象的同步代碼塊時(shí),另外的線程可以訪問(wèn)該對(duì)象的非同步代碼塊
若鎖住的是同一個(gè)對(duì)象,一個(gè)線程在訪問(wèn)對(duì)象的同步代碼塊時(shí),另一個(gè)線程訪問(wèn)對(duì)象的同步方法,會(huì)被阻塞
類鎖和對(duì)象鎖互補(bǔ)干擾
synchronized底層實(shí)現(xiàn)原理:
Monitor:每個(gè)java對(duì)象天生自帶了一把看不見(jiàn)的鎖(c++實(shí)現(xiàn))
Monitor鎖的競(jìng)爭(zhēng)、獲取與釋放
自旋鎖:緣由,1、許多情況下,共享數(shù)據(jù)的鎖定狀態(tài)持續(xù)時(shí)間較短,切換線程不值得。2、通過(guò)讓線程執(zhí)行忙循環(huán)等待鎖的釋放,不讓出CPU。3、若鎖被其他線程長(zhǎng)時(shí)間占用,會(huì)帶來(lái)許多性能上的開(kāi)銷
自適應(yīng)自旋鎖:1、自旋的次數(shù)不固定。2、由前一次在同一個(gè)鎖上的自旋時(shí)間及鎖的擁有者的狀態(tài)來(lái)決定
鎖消除:JIT編譯時(shí),對(duì)運(yùn)行上下文進(jìn)行掃描,去除不可能存在競(jìng)爭(zhēng)的鎖
鎖粗化:通過(guò)擴(kuò)大鎖的范圍,避免反復(fù)的加鎖和解鎖
鎖的內(nèi)存語(yǔ)義:
當(dāng)線程釋放鎖時(shí),Java內(nèi)存模型會(huì)把該線程對(duì)應(yīng)的本地內(nèi)存中的共享變量刷新到主內(nèi)存中去;
而當(dāng)線程獲得鎖時(shí),Java內(nèi)存模型會(huì)把該線程對(duì)應(yīng)的本地內(nèi)存置為無(wú)效,從而使得監(jiān)視器保護(hù)的臨界區(qū)代碼必須從主內(nèi)存中讀取共享變量。
synchronized的四種狀態(tài):
無(wú)鎖
偏向鎖:減少同一線程獲取鎖的代價(jià),大多數(shù)情況下,鎖不存在多線程競(jìng)爭(zhēng),總是由同一線程多層次獲得。核心思想:如果一個(gè)線程獲得了鎖,那么鎖就進(jìn)入偏向模式,此時(shí)MarkWord的結(jié)構(gòu)也變?yōu)槠蜴i結(jié)構(gòu),當(dāng)該線程再次請(qǐng)求鎖時(shí),無(wú)需任何同步操作,即獲取鎖的過(guò)程只需要檢查Markword的鎖標(biāo)記位為偏向鎖以及當(dāng)前線程Id等于Markword的ThreadId即可,這樣就省去了大量有關(guān)鎖申請(qǐng)的操作。不適合鎖競(jìng)爭(zhēng)比較激烈的多線程場(chǎng)合
輕量級(jí)鎖:由偏向鎖升級(jí)來(lái)的,偏向鎖運(yùn)行在一個(gè)線程進(jìn)入同步塊的情況下,當(dāng)?shù)诙€(gè)線程加入鎖爭(zhēng)用的時(shí)候,偏向鎖就會(huì)升級(jí)為輕量級(jí)鎖。適應(yīng)場(chǎng)景:線程交替執(zhí)行同步代碼塊。若存在同一時(shí)間訪問(wèn)同一鎖的情況,就導(dǎo)致輕量級(jí)鎖膨脹為重量級(jí)鎖

以上就是動(dòng)力節(jié)點(diǎn)Java培訓(xùn)機(jī)構(gòu)小編介紹的“Java線程與多線程面試問(wèn)答題”的內(nèi)容,希望對(duì)大家有幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)推薦
相關(guān)閱讀
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)