更新時(shí)間:2023-02-03 14:37:37 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1580次
Java高并發(fā)一直都是程序員們的必須課,想要順利進(jìn)入到這個(gè)行業(yè),這個(gè)知識點(diǎn)是必須要掌握的,只有熟練運(yùn)用了才能讓我們在面試者中脫穎而出,提升我們的就業(yè)機(jī)會(huì)。這幾道關(guān)于高并發(fā)的面試題,大家最好熟記,以免面試時(shí)不知道如何應(yīng)對。
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í)行部分無法停止,標(biāo)志變量最好設(shè)置為volatile。
3.普通線程與守護(hù)線程?
本質(zhì)都是線程沒什么區(qū)別,守護(hù)線程在主線程結(jié)束時(shí)將被拋棄,自動(dòng)退出。比如垃圾回收線程。
4.數(shù)據(jù)庫死鎖?
在執(zhí)行一個(gè)事務(wù)時(shí)可能要獲取多個(gè)鎖,一直持有鎖到事務(wù)提交,如果A事務(wù)需要獲取的鎖在另一個(gè)事務(wù)B中,且B事務(wù)也在等待A事務(wù)所持有的鎖,那么兩個(gè)事務(wù)之間就會(huì)發(fā)生死鎖。但數(shù)據(jù)庫死鎖比較少見,數(shù)據(jù)庫會(huì)加以干涉死鎖問題,犧牲一個(gè)事務(wù)使得其他事務(wù)正常執(zhí)行。
5.什么是鎖順序死鎖?
兩個(gè)線程試圖以不同的順序獲得相同的鎖,那么可能發(fā)發(fā)生死鎖。比如轉(zhuǎn)賬問題,由from賬戶向to賬戶轉(zhuǎn)賬,假設(shè)每次我們先同步from對象,再同步to賬戶,然后執(zhí)行轉(zhuǎ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)線程由于無法訪問需要的資源而不能繼續(xù)執(zhí)行時(shí),就是饑餓狀態(tài)?;铈i是線程雖然沒有阻塞,但也不能繼續(xù)執(zhí)行,因?yàn)槌绦蚩偸菆?zhí)行相同的操作,且結(jié)果都是失敗。
8.多線程性能問題?
使用多線程主要就是為了提高程序的運(yùn)行性能,多線程可以更充分發(fā)揮系統(tǒng)可處理能力,從而提高系統(tǒng)資源利用率。但多線程自身同時(shí)帶來了性能開銷,線程的創(chuàng)建與銷毀,線程間的協(xié)調(diào)(比如加鎖、內(nèi)存同步),線程調(diào)度,上下文的切換等。好的并發(fā)設(shè)計(jì)就是充分利用現(xiàn)有資源,盡可能使處理器忙碌起來,當(dāng)然程序設(shè)計(jì)始終不能脫離業(yè)務(wù)場景。
9.內(nèi)存同步?
在synchronized和volatile提供的可見性保證中可能會(huì)用到內(nèi)存屏障,內(nèi)存屏障可以刷新緩存,使緩存無效。同時(shí)內(nèi)存屏障會(huì)抑制一些編譯器優(yōu)化操作,大多數(shù)操作不能被重排序。
10.jvm同步優(yōu)化?
jvm可以通過優(yōu)化去掉一些不必要的鎖,從而減少同步開銷。比如一個(gè)對象只能被當(dāng)前線程訪問,其他線程不會(huì)與當(dāng)前線程在這個(gè)鎖上發(fā)生同步,jvm可以鎖優(yōu)化去掉同步操作。編譯器也可以進(jìn)行鎖粒度粗化操作,將臨近的多個(gè)同步代碼用一個(gè)鎖合并起來,不僅可以減少多個(gè)同步帶來的不必要的開銷,同時(shí)還能使優(yōu)化器處理更大的代碼塊,帶來進(jìn)一步的優(yōu)化。鎖自旋,當(dāng)線程發(fā)生阻塞時(shí),可能會(huì)自旋等待(不斷循環(huán)嘗試去獲取鎖),或者通過操作系統(tǒng)掛起線程,當(dāng)然這要看鎖等待時(shí)間,來決定是否自旋。
以上就是“常見的求職Java高并發(fā)編程面試題”,你能回答上來嗎?如果想要了解更多的Java面試題相關(guān)內(nèi)容,可以關(guān)注動(dòng)力節(jié)點(diǎn)Java官網(wǎng)。
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743