欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

字節(jié)跳動java研發(fā)面試題整理(含答案)

  發(fā)布時間:2019-08-29 16:38:10   作者:無聊看看網(wǎng)   我要評論
這篇文章主要介紹了字節(jié)跳動java研發(fā)面試題整理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

字節(jié)跳動java研發(fā)面試題:為什么要用線程池

那先要明白什么是線程池

線程池是指在初始化一個多線程應(yīng)用程序過程中創(chuàng)建一個線程集合,然后在需要執(zhí)行新的任務(wù)時重用這些線程而不是新建一個線程。

使用線程池的好處

  • 線程池改進了一個應(yīng)用程序的響應(yīng)時間。由于線程池中的線程已經(jīng)準(zhǔn)備好且等待被分配任務(wù),應(yīng)用程序可以直接拿來使用而不用新建一個線程。
  • 線程池節(jié)省了CLR 為每個短生存周期任務(wù)創(chuàng)建一個完整的線程的開銷并可以在任務(wù)完成后回收資源。
  • 線程池根據(jù)當(dāng)前在系統(tǒng)中運行的進程來優(yōu)化線程時間片。
  • 線程池允許我們開啟多個任務(wù)而不用為每個線程設(shè)置屬性。
  • 線程池允許我們?yōu)檎趫?zhí)行的任務(wù)的程序參數(shù)傳遞一個包含狀態(tài)信息的對象引用。
  • 線程池可以用來解決處理一個特定請求最大線程數(shù)量限制問題。

字節(jié)跳動java研發(fā)面試題:MySQL優(yōu)化經(jīng)驗

對查詢進行優(yōu)化,應(yīng)盡量避免全表掃描,首先應(yīng)考慮在 where 及 order by 涉及的列上建立索引。

應(yīng)盡量避免在 where 子句中使用!=或<>操作符,否則引擎將放棄使用索引而進行全表掃描。

盡量使用數(shù)字型字段,若只含數(shù)值信息的字段盡量不要設(shè)計為字符型,這會降低查詢和連接的性能,并會增加存儲開銷。這是因為引擎在處理查詢和連接時會逐個比較字符串中每一個字符,而對于數(shù)字型而言只需要比較一次就夠了。

任何地方都不要使用 select * from t ,用具體的字段列表代替“*”,不要返回用不到的任何字段。

避免頻繁創(chuàng)建和刪除臨時表,以減少系統(tǒng)表資源的消耗。諸如此類,等等等等......

什么是線程死鎖?死鎖如何產(chǎn)生?如何避免線程死鎖?

死鎖的介紹:

線程死鎖是指由于兩個或者多個線程互相持有對方所需要的資源,導(dǎo)致這些線程處于等待狀態(tài),無法前往執(zhí)行。當(dāng)線程進入對象的synchronized代碼塊時,便占有了資源,直到它退出該代碼塊或者調(diào)用wait方法,才釋放資源,在此期間,其他線程將不能進入該代碼塊。當(dāng)線程互相持有對方所需要的資源時,會互相等待對方釋放資源,如果線程都不主動釋放所占有的資源,將產(chǎn)生死鎖。

死鎖的產(chǎn)生的一些特定條件:

  • 互斥條件:進程對于所分配到的資源具有排它性,即一個資源只能被一個進程占用,直到被該進程釋放 。
  • 請求和保持條件:一個進程因請求被占用資源而發(fā)生阻塞時,對已獲得的資源保持不放。
  • 不剝奪條件:任何一個資源在沒被該進程釋放之前,任何其他進程都無法對他剝奪占用。
  • 循環(huán)等待條件:當(dāng)發(fā)生死鎖時,所等待的進程必定會形成一個環(huán)路(類似于死循環(huán)),造成永久阻塞。

如何避免:

1. 加鎖順序:當(dāng)多個線程需要相同的一些鎖,但是按照不同的順序加鎖,死鎖就很容易發(fā)生。如果能確保所有的線程都是按照相同的順序獲得鎖,那么死鎖就不會發(fā)生。當(dāng)然這種方式需要你事先知道所有可能會用到的鎖,然而總有些時候是無法預(yù)知的。

2. 加鎖時限:加上一個超時時間,若一個線程沒有在給定的時限內(nèi)成功獲得所有需要的鎖,則會進行回退并釋放所有已經(jīng)獲得的鎖,然后等待一段隨機的時間再重試。但是如果有非常多的線程同一時間去競爭同一批資源,就算有超時和回退機制,還是可能會導(dǎo)致這些線程重復(fù)地嘗試但卻始終得不到鎖。

3. 死鎖檢測:死鎖檢測即每當(dāng)一個線程獲得了鎖,會在線程和鎖相關(guān)的數(shù)據(jù)結(jié)構(gòu)中(map、graph等等)將其記下。除此之外,每當(dāng)有線程請求鎖,也需要記錄在這個數(shù)據(jù)結(jié)構(gòu)中。死鎖檢測是一個更好的死鎖預(yù)防機制,它主要是針對那些不可能實現(xiàn)按序加鎖并且鎖超時也不可行的場景。

字節(jié)跳動java研發(fā)面試題:spring中Bean的作用域

1. singleton:Spring IoC容器中只會存在一個共享的Bean實例,無論有多少個Bean引用它,始終指向同一對象。Singleton作用域是Spring中的缺省作用域。
2. prototype:每次通過Spring容器獲取prototype定義的bean時,容器都將創(chuàng)建一個新的Bean實例,每個Bean實例都有自己的屬性和狀態(tài),而singleton全局只有一個對象。
3. request:在一次Http請求中,容器會返回該Bean的同一實例。而對不同的Http請求則會產(chǎn)生新的Bean,而且該bean僅在當(dāng)前Http Request內(nèi)有效。
4. session:在一次Http Session中,容器會返回該Bean的同一實例。而對不同的Session請求則會創(chuàng)建新的實例,該bean實例僅在當(dāng)前Session內(nèi)有效。
5. global Session:在一個全局的Http Session中,容器會返回該Bean的同一個實例,僅在使用portlet context時有效。

字節(jié)跳動java研發(fā)面試題:Spring框架中都用到了哪些設(shè)計模式?

1. 代理模式:在AOP和remoting中被用的比較多。
2. 單例模式:在spring配置文件中定義的bean默認(rèn)為單例模式。
3. 模板方法模式:用來解決代碼重復(fù)的問題。
4. 前端控制器模式:Spring提供了DispatcherServlet來對請求進行分發(fā)。
5. 依賴注入模式:貫穿于BeanFactory / ApplicationContext接口的核心理念。
6. 工廠模式:BeanFactory用來創(chuàng)建對象的實例。

字節(jié)跳動java研發(fā)面試題:springmvc的核心是什么,請求的流程是怎么處理的,控制反轉(zhuǎn)怎么實現(xiàn)的

核心:控制反轉(zhuǎn)和面向切面

請求處理流程:

首先用戶發(fā)送請求到前端控制器,前端控制器根據(jù)請求信息(如URL)來決定選擇哪一個頁面控制器進行處理并把請求委托給它,即以前的控制器的控制邏輯部分;

頁面控制器接收到請求后,進行功能處理,首先需要收集和綁定請求參數(shù)到一個對象,并進行驗證,然后將命令對象委托給業(yè)務(wù)對象進行處理;處理完畢后返回一個ModelAndView(模型數(shù)據(jù)和邏輯視圖名);

前端控制器收回控制權(quán),然后根據(jù)返回的邏輯視圖名,選擇相應(yīng)的視圖進行渲染,并把模型數(shù)據(jù)傳入以便視圖渲染;

前端控制器再次收回控制權(quán),將響應(yīng)返回給用戶。

字節(jié)跳動java研發(fā)面試題:JVM的內(nèi)存結(jié)構(gòu)

根據(jù) JVM 規(guī)范,JVM 內(nèi)存共分為虛擬機棧、堆、方法區(qū)、程序計數(shù)器、本地方法棧五個部分。
1. Java虛擬機棧:線程私有;每個方法在執(zhí)行的時候會創(chuàng)建一個棧幀,存儲了局部變量表,操作數(shù)棧,動態(tài)連接,方法返回地址等;每個方法從調(diào)用到執(zhí)行完畢,對應(yīng)一個棧幀在虛擬機棧中的入棧和出棧。
2. 堆:線程共享;被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機啟動時創(chuàng)建,用于存放對象實例。
3. 方法區(qū):線程共享;被所有線程共享的一塊內(nèi)存區(qū)域;用于存儲已被虛擬機加載的類信息,常量,靜態(tài)變量等。
4. 程序計數(shù)器:線程私有;是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器,每條線程都要有一個獨立的程序計數(shù)器,這類內(nèi)存也稱為“線程私有”的內(nèi)存。
5. 本地方法棧:線程私有;主要為虛擬機使用到的Native方法服務(wù)。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論