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