黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 職業(yè)指南 大廠級別的多線程面試題

大廠級別的多線程面試題

更新時間:2022-12-21 15:36:22 來源:動力節(jié)點 瀏覽1384次

1、什么是線程和進程?

進程:在操作系統(tǒng)中能夠獨立運行,并且作為資源分配的基本單位。它表示運行中的程序。系統(tǒng)運行一個程序就是一個進程從創(chuàng)建、運行到消亡的過程。

線程:是一個比進程更小的執(zhí)行單位,能夠完成進程中的一個功能,也被稱為輕量級進程。一個進程在其執(zhí)行的過程中可以產(chǎn)生多個線程。

【注】線程與進程不同的是:同類的多個線程共享進程的堆和方法區(qū)資源,但每個線程有自己的程序計數(shù)器、虛擬機棧和本地方法棧,所以系統(tǒng)在產(chǎn)生一個線程,或是在各個線程之間作切換工作時,負擔要比進程小得多。

多線程面試題

為什么程序計數(shù)器、虛擬機棧和本地方法棧是線程私有的呢?為什么堆和方法區(qū)是線程共享的呢?

  • 程序計數(shù)器為什么是私有的?

程序計數(shù)器主要有下面兩個作用:

字節(jié)碼解釋器通過改變程序計數(shù)器來依次讀取指令,從而實現(xiàn)代碼的流程控制,如:順序執(zhí)行、選擇、循環(huán)、異常處理。

在多線程的情況下,程序計數(shù)器用于記錄當前線程執(zhí)行的位置,從而當線程被切換回來的時候能夠知道該線程上次運行到哪兒了。

(需要注意的是,如果執(zhí)行的是 native 方法,那么程序計數(shù)器記錄的是 undefined 地址,只有執(zhí)行的是 Java 代碼時程序計數(shù)器記錄的才是下一條指令的地址。)

所以,程序計數(shù)器私有主要是為了線程切換后能恢復到正確的執(zhí)行位置。

  • 虛擬機棧和本地方法棧為什么是私有的?

虛擬機棧: 每個 Java 方法在執(zhí)行的同時會創(chuàng)建一個棧幀用于存儲局部變量表、操作數(shù)棧、常量池引用等信息。從方法調(diào)用直至執(zhí)行完成的過程,就對應著一個棧幀在 Java 虛擬機棧中入棧和出棧的過程。

本地方法棧: 和虛擬機棧所發(fā)揮的作用非常相似,區(qū)別是: 虛擬機棧為虛擬機執(zhí)行 Java 方法 (也就是字節(jié)碼)服務,而本地方法棧則為虛擬機使用到的 Native 方法服務。 在 HotSpot 虛擬機中和 Java 虛擬機棧合二為一。

所以,為了保證線程中的局部變量不被別的線程訪問到,虛擬機棧和本地方法棧是線程私有的。

堆和方法區(qū)是所有線程共享的資源,其中:

堆是進程中最大的一塊內(nèi)存,主要用于存放新創(chuàng)建的對象 (所有對象都在這里分配內(nèi)存)。

方法區(qū)主要用于存放已被加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù)。

2、什么是上下文切換?

即使單核處理器也支持多線程執(zhí)行代碼,CPU通過給每個線程分配CPU時間片來實現(xiàn)這個機制。時間片是CPU分配給各個線程的時間,因為時間片非常短,所以CPU通過不停地切換線程執(zhí)行,讓我們感覺多個線程是同時執(zhí)行的。(時間片一般是幾十毫秒)

CPU通過時間片分配算法來循環(huán)執(zhí)行任務,當前任務執(zhí)行一個時間片后會切換到下一個任務。但是,在切換前會保存上一個任務的狀態(tài),以便下次切換回這個任務時,可以再加載這個任務的狀態(tài)。所以任務從保存到加載的過程就是一次上下文切換。上下文切換會影響多線程的執(zhí)行速度。

3、并發(fā)與并行?

并發(fā)指的是多個任務交替進行,并行則是指真正意義上的“同時進行”。

實際上,如果系統(tǒng)內(nèi)只有一個CPU,使用多線程時,在真實系統(tǒng)環(huán)境下不能并行,只能通過切換時間片的方式交替進行,從而并發(fā)執(zhí)行任務。真正的并行只能出現(xiàn)在擁有多個CPU的系統(tǒng)中。

4、線程的生命周期和狀態(tài)?(重要!)

Java 線程在運行的生命周期中的指定時刻只可能處于下面 6 種不同狀態(tài)的其中一個狀態(tài):

初始狀態(tài)、運行狀態(tài)、阻塞狀態(tài)、等待狀態(tài)、超時等待狀態(tài)、終止狀態(tài)

多線程面試題

線程在生命周期中并不是固定處于某一個狀態(tài)而是隨著代碼的執(zhí)行在不同狀態(tài)之間切換:

多線程面試題

  • 線程創(chuàng)建之后它將處于 初始狀態(tài)(NEW),調(diào)用 start() 方法后開始運行,線程這時候處于 可運行狀態(tài)(READY)。
  • 可運行狀態(tài)的線程獲得了 CPU 時間片后就處于 運行狀態(tài)(RUNNING)。
  • 當線程執(zhí)行 wait()方法之后,線程進入 等待狀態(tài)(WAITING),進入等待狀態(tài)的線程需要依靠其他線程的通知才能夠返回到運行狀態(tài)【notify()】。 而 超時等待狀態(tài)(TIME_WAITING)相當于在等待狀態(tài)的基礎上增加了超時限制,【sleep(long millis)/wait(long millis)】,當超時時間到達后 Java 線程將會返回到運行狀態(tài)。
  • 當線程調(diào)用同步方法時,在沒有獲取到鎖的情況下,線程將會進入到阻塞狀態(tài)(BLOCKED)。
  • 線程在執(zhí)行 Runnable 的run()方法之后將會進入到 終止狀態(tài)(TERMINATED)。

5、什么是線程死鎖?如何避免死鎖?

多個線程同時被阻塞,它們中的一個或者全部都在等待某個資源被釋放。由于線程被無限期地阻塞,因此程序不可能正常終止。

假如線程 A 持有資源 2,線程 B 持有資源 1,他們同時都想申請對方的資源,所以這兩個線程就會互相等待而進入死鎖狀態(tài)。

避免死鎖的幾個常見方法:

  • 避免一個線程同時獲取多個鎖
  • 避免一個線程在鎖內(nèi)同時占用多個資源,盡量保證每個鎖只占用一個資源。
  • 嘗試使用定時鎖,使用 lock.tryLock(timeout) 來代替使用內(nèi)部鎖機制。
  • 對于數(shù)據(jù)庫鎖,加鎖和解鎖必須在一個數(shù)據(jù)庫連接里,否則會出現(xiàn)解鎖失敗的情況。

 以上就是“大廠級別的多線程面試題”,你能回答上來嗎?如果想要了解更多的Java面試題相關內(nèi)容,可以關注動力節(jié)點Java官網(wǎng)。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 国产精品成人久久久久 | 好色在线 | 亚洲日本韩国在线 | 亚洲无线乱码高清在线观看一区 | 爽天天天天天天天 | 亚洲福利在线视频 | 国产黄网永久免费 | 目韩一区二区三区系列片丶 | 99视频精品全国在线观看 | 黄色毛片免费 | 成人软件网18免费视频 | 有哪些免费的毛片可以看 | www.日本视频| 天天摸天天碰天天碰 | 亚洲欧美日韩国产精品影院 | 你懂的 在线视频 | 亚洲三级欧美 | 中文字幕视频 | 日日夜人人澡人人澡人人看免 | 日本国产在线视频 | 日产精品一二三四区国产 | 国产欧美成人不卡视频 | 午夜剧场操一操 | 亚洲一区二区三区高清网 | 亚洲人成网站在线观看青青 | a免费看 | 国产乱人乱精一区二区视频密 | 青草青草视频2免费观看 | 日本老年人精品久久中文字幕 | 夜夜夜夜曰天天天天拍国产 | 最近中文国语字幕在线播放视频 | 国产bbwbbwbbwbbw | 波多野结衣中文字幕在线视频 | 小明永久免费大陆在线观看 | 亚洲图片欧美色图 | 一道本在线 | 99在线精品视频免费观里 | 欧美大片国产在线永久播放 | 欧美一区二区三区视视频 | 日日草天天干 | 中文字幕日韩国产 |