更新時(shí)間:2023-02-03 14:37:37 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1439次
Java高并發(fā)一直都是程序員們的必須課,想要順利進(jìn)入到這個(gè)行業(yè),這個(gè)知識(shí)點(diǎn)是必須要掌握的,只有熟練運(yùn)用了才能讓我們?cè)诿嬖囌咧忻摲f而出,提升我們的就業(yè)機(jī)會(huì)。這幾道關(guān)于高并發(fā)的面試題,大家最好熟記,以免面試時(shí)不知道如何應(yīng)對(duì)。
1.Thread的start方法和run方法的區(qū)別?
run方法就是普通的一個(gè)方法,代碼運(yùn)行在當(dāng)前主線程,start會(huì)啟動(dòng)一個(gè)新的線程,并運(yùn)行run方法。
2.如何停止線程運(yùn)行?
可以設(shè)置一個(gè)標(biāo)志位,任務(wù)定期檢查這個(gè)標(biāo)記,如果標(biāo)志設(shè)置為取消則任務(wù)停止執(zhí)行,但已執(zhí)行部分無(wú)法停止,標(biāo)志變量最好設(shè)置為volatile。
3.普通線程與守護(hù)線程?
本質(zhì)都是線程沒(méi)什么區(qū)別,守護(hù)線程在主線程結(jié)束時(shí)將被拋棄,自動(dòng)退出。比如垃圾回收線程。
4.數(shù)據(jù)庫(kù)死鎖?
在執(zhí)行一個(gè)事務(wù)時(shí)可能要獲取多個(gè)鎖,一直持有鎖到事務(wù)提交,如果A事務(wù)需要獲取的鎖在另一個(gè)事務(wù)B中,且B事務(wù)也在等待A事務(wù)所持有的鎖,那么兩個(gè)事務(wù)之間就會(huì)發(fā)生死鎖。但數(shù)據(jù)庫(kù)死鎖比較少見(jiàn),數(shù)據(jù)庫(kù)會(huì)加以干涉死鎖問(wèn)題,犧牲一個(gè)事務(wù)使得其他事務(wù)正常執(zhí)行。
5.什么是鎖順序死鎖?
兩個(gè)線程試圖以不同的順序獲得相同的鎖,那么可能發(fā)發(fā)生死鎖。比如轉(zhuǎn)賬問(wèn)題,由from賬戶向to賬戶轉(zhuǎn)賬,假設(shè)每次我們先同步from對(duì)象,再同步to賬戶,然后執(zhí)行轉(zhuǎn)賬操作,貌似沒(méi)什么問(wèn)題。如果這時(shí)候to賬戶同時(shí)向from賬戶轉(zhuǎn)賬,那么兩個(gè)線程可能要永久等待了。
6.死鎖的避免與診斷?
如果一個(gè)線程最多只能獲取一個(gè)鎖,那么就不會(huì)發(fā)生鎖順序死鎖了。如果確實(shí)需要獲取多個(gè)鎖,鎖的順序可以按照某種規(guī)約,比如兩個(gè)資源的id值,程序按規(guī)約保證獲取鎖的順序一致。或者可以使用顯式的鎖Lock,獲取鎖的時(shí)候設(shè)置超時(shí)時(shí)間,超時(shí)后可以重新發(fā)起,以避免發(fā)生死鎖。
7.線程饑餓與活鎖?
當(dāng)線程由于無(wú)法訪問(wèn)需要的資源而不能繼續(xù)執(zhí)行時(shí),就是饑餓狀態(tài)。活鎖是線程雖然沒(méi)有阻塞,但也不能繼續(xù)執(zhí)行,因?yàn)槌绦蚩偸菆?zhí)行相同的操作,且結(jié)果都是失敗。
8.多線程性能問(wèn)題?
使用多線程主要就是為了提高程序的運(yùn)行性能,多線程可以更充分發(fā)揮系統(tǒng)可處理能力,從而提高系統(tǒng)資源利用率。但多線程自身同時(shí)帶來(lái)了性能開(kāi)銷,線程的創(chuàng)建與銷毀,線程間的協(xié)調(diào)(比如加鎖、內(nèi)存同步),線程調(diào)度,上下文的切換等。好的并發(fā)設(shè)計(jì)就是充分利用現(xiàn)有資源,盡可能使處理器忙碌起來(lái),當(dāng)然程序設(shè)計(jì)始終不能脫離業(yè)務(wù)場(chǎng)景。
9.內(nèi)存同步?
在synchronized和volatile提供的可見(jiàn)性保證中可能會(huì)用到內(nèi)存屏障,內(nèi)存屏障可以刷新緩存,使緩存無(wú)效。同時(shí)內(nèi)存屏障會(huì)抑制一些編譯器優(yōu)化操作,大多數(shù)操作不能被重排序。
10.jvm同步優(yōu)化?
jvm可以通過(guò)優(yōu)化去掉一些不必要的鎖,從而減少同步開(kāi)銷。比如一個(gè)對(duì)象只能被當(dāng)前線程訪問(wèn),其他線程不會(huì)與當(dāng)前線程在這個(gè)鎖上發(fā)生同步,jvm可以鎖優(yōu)化去掉同步操作。編譯器也可以進(jìn)行鎖粒度粗化操作,將臨近的多個(gè)同步代碼用一個(gè)鎖合并起來(lái),不僅可以減少多個(gè)同步帶來(lái)的不必要的開(kāi)銷,同時(shí)還能使優(yōu)化器處理更大的代碼塊,帶來(lái)進(jìn)一步的優(yōu)化。鎖自旋,當(dāng)線程發(fā)生阻塞時(shí),可能會(huì)自旋等待(不斷循環(huán)嘗試去獲取鎖),或者通過(guò)操作系統(tǒng)掛起線程,當(dāng)然這要看鎖等待時(shí)間,來(lái)決定是否自旋。
以上就是“常見(jiàn)的求職Java高并發(fā)編程面試題”,你能回答上來(lái)嗎?如果想要了解更多的Java面試題相關(guān)內(nèi)容,可以關(guān)注動(dòng)力節(jié)點(diǎn)Java官網(wǎng)。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743