java程序員的金三銀四求職寶典(二)

程序員的金三銀四求職寶典

隨著春天的腳步漸近,對于許多程序員來說,一年中最繁忙、最重要的面試季節也隨之而來。金三銀四,即三月和四月,被廣大程序員視為求職的黃金時期。在這兩個月里,各大公司紛紛開放招聘,求職者們則通過一輪又一輪的面試,力爭心儀的職位。而如何在這關鍵的時期脫穎而出,成為每個求職者關注的焦點。在金三銀四的關鍵時期如何準備,快來看看吧

面試題解析

接著上一篇面試題解析(java程序員的金三銀四求職寶典),咱們繼續……

21、使用submit和execute向線程池提交任務的區別?

答:這兩種提交方式都是JDK提供的。

  1. 來源不同:execute是頂級接口executor中定義的,submit(好幾種重載形式)是executorService接口中定義的;
  2. 接收參數不同:execute方法只能接收Runnable接口任務,而submit可以接收Runnable和Callable的任務;
  3. 返回值不同:execute返回void,submit返回Future。
  4. 異常:execute執行任務時,如果遇到任務會拋出異常,subumit不會直接拋出異常,只有在使用Future的get方法獲取返回值時,才拋出異常。

22、進程和線程

答:進程有自己獨立的內存空間。進程時應用程序,,一個進程可以有多個線程。

進程是操作系統級別的,線程是CPU級別的。

線程的生命周期:

  1. 新建狀態;
  2. 可運行狀態(分為就緒和運行);
  3. 阻塞狀態;
  4. 等待狀態;----wait
  5. 超時等待狀態;---sleep
  6. 死亡狀態。

23、死鎖產生的原因?怎么避免?

  1. 互斥:一個資源每次只能被一個進程使用;
  2. 請求和保持:一個進程因請求資源而阻塞時,不釋放獲得資源;
  3. 不剝奪:進程已獲得的資源,在未使用之前,不能強行剝奪;
  4. 循環等待:進程之間循環等待資源

避免死鎖那就打破產生死鎖的原因:

  1. 加鎖保證互斥;
  2. 一次性申請所有資源;
  3. 按序申請資源;
  4. 占有部分資源時,線程進一步申請資源,如果申請不到那就釋放占有的資源。

24、Synchronized的底層原理?

答:簡單來說,底層就是內部有一個計數器,當計數器為0的時候表示可以成功獲取到鎖,獲取到后將計數器設置為1;當線程執行完后,在將計數器設置為0.

25、Volatile和synchronized的區別?

答:

  1. Volatile只能作用在變量上,synchronized可以作用在類、方法、代碼塊、變量上;
  2. Volatile只能保證可見性,synchronized可以保證可見性和原子性;
  3. Volatile禁用指令重排,synchronized不會;
  4. Volatile不會造成阻塞,synchronized會。

26、synchronized和lock的區別?

答:

1、synchronized作用在類、方法、代碼塊、變量上,lock作用在方法中;

2、synchronized不知道是否將鎖釋放,lock是手動釋放鎖的,所以知道;lock一般使用ReentrantLock類做為鎖。

27、Threadlocal與synchronized的區別?

答:

  1. synchronized用于線程間的數據共享,Threadlocal則用于線程間的數據隔離;
  2. synchronized是利用鎖的機制,是變量或者代碼塊在某一時刻只能被一個線程訪問。而Threadlocal為每一個線程都提供一個變量副本。
  3. 上述兩個都是解決多線程并發訪問的問題。

28、Threadlocal內存泄露?

答:每個線程都有一個ThreadLocalMap,Map中的元素key為ThreadLocal,值對應線程的變量副本。

垃圾回收時會自動回收key,而value的回收取決與thread對象的生命周期。一般都是使用線程池進行線程復用操作的,這就導致線程對象的生命周期比較長,這樣便會一直存在一條強引用鏈的關系。隨著任務的執行,value可能就會越來越多且無法釋放,最終導致內存泄露

29、內存泄露和內存溢出的區別?

答:內存溢出就是在申請內存空間時,內存空間不夠。內存泄露是指程序申請內存后,無法釋放已申請的內存,一次內存泄漏的危害可以忽略,,但是內存泄露堆積后果很嚴重。內存泄露最終會導致內存溢出。

30、紅黑樹是怎么調整平衡的?

答:

  1. 左旋;
  2. 右旋;
  3. 改變顏色。

31、什么是回表查詢?如何避免回表查詢?

答:回表查詢的本質:是普通索引找不到我們要的完整信息,迫不得已要執行回表操作。也就是多次B+樹的查詢操作,會導致效率低。

怎么解決?就是可以建立聯合索引。

32、使用了范圍查找還能走索引嗎?

答:如果嚴格意義上來說,使用了范圍查找是不會走索引的。但是像in這種范圍查詢本質上是等值查詢,它也會走索引的。

33、Redis分布式鎖?Redis持久化方式?

答:先理解一下,為啥會問redis的持久化方式呢?因為redis的特點就是單線程也快,歸結于redis是一個內存數據庫。但是內存數據庫一般有個缺點就是,內存相對于磁盤存儲來說,存儲空間太小了,空間很容易就不足了。因此,會有持久化操作方式。redis持久化就是將數據寫在磁盤,可以有效地避免因進程退出造成的數據丟失問題,當下次重啟時利用之前持久化的文件即可實現數據恢復。

Redis的持久化方式:1、RDB;2、AOF。

1、RDB(Redis DataBase):把當前進程數據生成快照保存到硬盤的過程。所謂內存快照就是將內存中的數據在某一時刻的狀態記錄下來。類似于拍照,把一瞬間的美記錄下來。

那么RDB是給哪些數據做快照呢?

RDB是將所有數據都記錄到磁盤中,但是,RDB文件越大,往磁盤上寫數據的時間開銷就越大。

RDB文件的生成是否會阻塞主線程?

Redis提供兩個手動命令來生成RDB文件,save和bgsave。

Save:會導致主線程阻塞,線上環境不建議使用。在主線程中使用的

Bgsave:創建一個子線程,專門用于寫入RDB文件,避免了主線程阻塞。Redis默認選擇bgsave作為RDB文件的生成方式。

2、AOF:以獨立日志的方式記錄每次寫命令,重啟時再重新執行AOF文件中的命令達到回復數據目的。AOF的主要作用是解決了數據持久化的實時性,目前是redis持久化的主流方式。AOF默認不開啟,默認RDB

分布式鎖

首先要達到分布式鎖,必須要求redis有互斥(就是一個客戶端加了鎖,另一個客戶端就加不了鎖)的能力。我們可以使用SETNX命令,這個命令表示SET if Not Exists,即如果key不存在,才會設置它的值,否則什么也不做。

兩個客戶端進程執行這個命令,可以達到互斥,實現分布式鎖。

客戶端1:申請加鎖,加鎖成功;

客戶端2:申請加鎖,因為它后達到,加鎖失敗。

此時,加鎖成功的客戶端,就可以操作共享資源。操作完成后,需要及時釋放鎖。直接執行DEL命令刪除key即可。

但是,這種方式存在很大的問題!!!當客戶端1拿到鎖后,如果發生如下情況,就會造成死鎖

  1. 進程處理業務邏輯異常,沒有及時釋放鎖
  2. 進程掛了,沒有機會釋放鎖

這時,客戶端1就會一直占用鎖,其他客戶端就永遠拿不到鎖。怎么解決這個問題?

  1. 將key設置有效時間;

上述操作還會有問題,因為redis釋放鎖是一個無腦操作,萬一釋放了別人的鎖呢萬一執行業務時間較長,設置鎖的有效期到了怎么辦

解決方案:客戶端加鎖時,設置一個只有客戶端自己知道的唯一標識進去。

解決方案:分布式鎖加看門狗。加鎖時,先設置一個過期時間,然后客戶端開啟一個守護線程,定時去檢測這個鎖的失效時間,如果鎖快要過期了,操作共享資源還未完成,那就自動對鎖進行續費,重新設置有效時間。

34、Redis的主從復制過程?

答:主從復制是為了達成高可用

  1. 為了避免單點redis服務器故障,準備多臺服務器,互相連通。將數據復制多個副本保存再不同的服務器上,連接再一起,并保證數據是同步的。
  2. 即使有一臺服務器宕機,其他服務器依然可以繼續提供服務。

主服務器:master(數據提供方)

從服務器:slave(數據接收方)

需要解決:數據同步問題;核心工作:master的數據復制都slave中。

主從復制:數據的復制只能是單向的,只能從主節點到從節點。

主從復制工作流程:

  1. 建立連接階段(連接)--總體是建立了socket連接

1.1設置master的地址和端口,保存master信息;

1.2建立socket連接

1.3發送ping命令(定時器任務)

1.4身份驗證

1.5發送slave端口信息

  1. 數據同步階段---slave初次連接master后,復制master的所有數據到slave中,slave數據庫狀態更新為master當前數據庫狀態

2.1請求同步數據;

2.2創建RDB同步數據;

2.3恢復RDB同步數據;

2.4請求部分同步數據;

2.5回復部分同步數據;

  1. 命令傳播階段---當master數據庫狀態修改后,導致主從服務器數據庫狀態不一致,此時需要讓主從數據同步到一致的狀態,同步的動作成為命令傳播。

35、聯合索引失效了怎么辦?

答:

聯合索引失效場景:

  1. 條件中不使用聯合索引的第一個字段;
  2. 條件中使用了范圍查詢--聯合索引只能對多個字段進行等值查詢進行優化,對范圍查詢的優化效果有限;
  3. 條件中使用了函數或者表達式--無法使用索引優化;
  4. 聯合索引的字段順序不合理--如果聯合索引的字段順序與查詢語句中的條件順尋不一致,那么聯合索引將失效。

避免來聯合索引失效方法:

  1. 查詢優化條件:避免范圍查詢、函數和表達式,盡量將聯合索引第一個字段包含再查詢條件中;
  2. 重新設計索引;
  3. 拆分聯合索引。

36、當運行一個項目時cpu的load過高,該怎么去解決呢?

答:

  1. 從編程語言層面上,full gc(垃圾回收機制)次數的增大或者死循環都可能造成cpu load增高;
  2. 尋找最占cpu的進程--ps ux;top -c;
  3. 尋找最耗cpu的線程;

37、Hashmap面試題?

答:

hashmap是一個線程不安全的map集合。

怎么實現線程安全的hashmap集合?

  1. 使用ConcurrentHashMap集合;
  2. 使用Collections類提供的synchronizedMap方法包裝HashMap,將HashMap對象包裝成一個線程安全的map對象。
  3. 使用ReentrantReadWriteLock類實現:使用ReentrantReadWriteLock類來控制HashMap中的讀寫操作,這樣就能夠在多個線程同時讀取HashMap的情況下,避免出現競爭條件。而寫操作則需要獨占鎖,保證只有一個線程執行寫操作,防止數據沖突。
  4. 使用sychronized關鍵字實現:這樣可以控制對hashmap的并發訪問,保證同一時刻只有一個線程再訪問hashmap。

Hashmap的底層是:數組+鏈表/紅黑樹;

當鏈表元素超過8時,自動裝換成紅黑樹存儲,重新創建一個hashmap復制。當紅黑樹元素為6時,自動轉換成鏈表存儲。Hashmap默認數組大小為16,擴容因子為0.75.當數組元素超過數組大小的0.75倍時,就擴容。Hashmap擴容后的長度直接變成之前的2倍。

紅黑樹:

  1. 只有黑或紅色節點;
  2. 一個路徑上的節點不允許有兩個連續的紅色節點;
  3. 根節點是黑色節點;
  4. 葉子節點都是黑色;
  5. 紅色節點的父親都是黑色節點。

為啥用紅黑樹不用鏈表?

就是時間復雜度的問題

Put方法最大能放多少對象?--就是數組的容量

如果內存足夠大,能夠一直擴容下去嗎?理論上是可以的。

如果一直擴容,對象多了后,會影響讀取嗎?擴容過程本身不會影響讀取操作,因為hashmap在進行擴容時,會使用一個新的更大的數組,并在后臺將元素逐個重新計算哈希碼、確定新的存儲位置,并復制到新的數組中。在這個過程中,原來的數組仍然可以被讀取,而新的數組是在后臺構建的。

38、java內存分區?類的加載過程?

答:

  1. 堆區--又稱GC堆;

所有線程所共享的一塊內存區域,在虛擬機啟動時創建。唯一的目的就是存放實例對象(new的對象還有數組)。也是java垃圾收集器管理的主要區域

  1. 棧區;

是線程私有的區域,它的生命周期和線程相同。每個方法在執行的時候都會同時創建一個棧用于存儲局部變量表、操作棧、動態鏈接、方法返回地址等信息。每一個方法從被調用到執行完成的過程,就對應這一個棧在虛擬機中從入棧到出棧的過程。

  1. 方法區--又稱Non-Heap;

與堆一樣是所有線程共享的內存區域用于存儲被虛擬機加載的類信息、常量、靜態變量即使編譯器編譯后的代碼等數據。

相對而言,垃圾收集器很少在這個區域回收垃圾。但是不代表不回收。這個區域的內存回收目標主要針對常量池的回收和類型的卸載

  1. 程序計數器;

程序計數器可以看作是當前線程所執行的字節碼的行號指示器。在虛擬機中,字節碼解釋器工作時就是通過這個計數器的值來選取下一條需要執行的字節碼指令,分支、循環、跳轉、異常處理和線程恢復

  1. 本地方法棧。

和棧的作用很像,區別是本地方法棧則為虛擬機提供使用到的Native方法服務

類的加載過程:加載--->驗證--->準備--->解析--->初始化--->使用--->卸載

  1. 加載:獲取二進制流轉化為.class文件;
  2. 驗證:確保被加載的類的正確性;.class文件頭;
  3. 準備:為類的靜態變量分配內存,并將其初始化默認值
  4. 解析:把類中的符號引用轉換為直接引用(符號引用就是來描述所引用的目標,JVM并不知道所引用的類的地址,所以解析階段就是把符號引用轉換為直接引用的地址);
  5. 初始化:

5.1類什么時候初始化:new、調用類的靜態方法、反射等;

5.2類的初始化順序:

  1. 假如這個類存在直接父類,并且這個類沒有被初始化(類只能被初始化一次),那就直接初始化直接父類;
  2. 加入類中存在初始化語句(static),那就依次執行

39、get請求和post請求有什么區別

答:

  1. get請求一般是去獲取數據,post一般是去提交數據
  2. get請求的參數會放在url路徑中,安全性較差,請求數據長度有限制,post請求的數據長度沒有限制,請求數據放在body中。
  3. 通常get請求產生一個TCP數據包,post請求會產生兩個TCP數據包。

40、介紹悲觀鎖和樂觀鎖一級使用場景?

答:

樂觀鎖:就是線程在操作數據時,不會去加鎖,認為沒有人修改數據;

悲觀鎖:比較悲觀,認為線程在操作數據時,會去修改數據,所以會加鎖。

樂觀鎖和悲觀鎖沒有優劣之分,只有合適的場景而已。

樂觀鎖適合讀多寫少,并發沖突小的場景。

悲觀鎖適合讀少寫多,并發沖突較多的場景。

接一個題外話,最近想學習以下高并發高可用的項目,請問有哪些項目推薦的呀?大家可以打在評論區討論以下,謝謝?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/717487.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/717487.shtml
英文地址,請注明出處:http://en.pswp.cn/news/717487.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

倒計時36天

C-小紅關雞_牛客周賽 Round 35 (nowcoder.com) //超時 134.17/175 主要是循環這部分的問題 #include <bits/stdc.h> using namespace std; #define int long long const int N 2e5 6; const int inf 0x3f3f3f3f; int a[N]; void solve() {int n,k;cin>>n>…

多模態大語言模型的ai反饋增強機器人操作研究

本研究關注于利用大語言模型&#xff08;LLMs&#xff09;提供的自動化偏好反饋來增強決策過程 ○ 提出了一種多模態LLM&#xff0c;稱為CriticGPT&#xff0c;可以理解機器人操作任務中的軌跡視頻&#xff0c;并提供分析和偏好反饋 ○ 從獎勵建模的角度驗證了CriticGPT生成的…

使用 MongoDB Atlas 無服務器實例更高效地開發應用程序

使用 MongoDB Atlas無服務器實例更高效地開發應用程序 身為開發者&#xff0c;數據庫并不一定需要您來操心。您可不想耗費時間來預配置集群或調整集群大小。同樣地&#xff0c;您也不想操心因未能正確擴展而導致經費超標。 MongoDB Atlas 可為您提供多個數據庫部署選項。雖然…

【javascript】快速入門javascript

本文前言及說明 適合學過一門語言有一定基礎的人看。 省略最初學習編程時的各種編程重復的基礎知識。 javascript簡介 編程語言&#xff08;主前端&#xff09; 用途&#xff1a;主web前后端&#xff0c;游戲&#xff0c;干別人網站 優點&#xff1a;速度快&#xff0c;瀏…

一文掃盲:室內導航系統的應用場景和技術實現(入門級)

hello&#xff0c;我是貝格前端工場&#xff0c;之間搞過一些室內導航項目&#xff0c;有2D也有3D的&#xff0c;算是有些經驗&#xff0c;這里給大家分享一下室內導航的基本嘗試&#xff0c;歡迎老鐵們點贊、關注&#xff0c;如有需求可以私信我們。 一、室內導航是什么 室內…

Vue開發實例(十)Tabs標簽頁打開、關閉與路由之間的關系

創建標簽頁 一、創建標簽頁二、點擊菜單展示新標簽頁1、將標簽數據作為全局使用2、菜單點擊增加標簽頁3、處理重復標簽4、關閉標簽頁 三、點擊標簽頁操作問題1&#xff1a;點擊標簽頁選中菜單進行高亮展示問題2&#xff1a;點擊標簽頁路由也要跳轉 四、解決bug 先展示最終效果 …

Android 基礎入門 基礎簡介

1. 觀察App運行日志 2.Android 開發設計的編程語言 koltin Java c c 3.工程目錄結構 4.Gradle 5.build.gradle 文件解析 plugins {id("com.android.application")//用了哪些插件 主配置文件版本控制 所以這里不用寫版本 }android {namespace "com.tiger.myap…

【C++】每周一題——2024.3.3(手滑再寫一篇)

題目 Cpp 【問題描述】 輸入一個由若干個以空格分隔的單詞組成的英文文章&#xff0c;求文章中最短的單詞&#xff08;文章以英文句點”.”結束&#xff0c;且字符數不超過200&#xff09;. 【輸入格式】 一行&#xff0c;表示輸入的英文文章。 【輸出格式】 一行&#xff0c;表…

反向代理與負載均衡

目錄 反向代理 負載均衡 反向代理 代理角色&#xff1a; 正常情況下&#xff0c;客戶端&#xff08;如瀏覽器&#xff09;直接與服務器通信&#xff0c;但在反向代理中&#xff0c;Nginx充當客戶端和服務器之間的中介。客戶端向Nginx發送請求&#xff0c;而Nginx負責將請求轉…

基于springboot+vue的二手車交易系統

博主主頁&#xff1a;貓頭鷹源碼 博主簡介&#xff1a;Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰&#xff0c;歡迎高校老師\講師\同行交流合作 ?主要內容&#xff1a;畢業設計(Javaweb項目|小程序|Pyt…

金三銀四,風控建模面試全攻略:從簡歷準備到面試技巧

隨著春天的到來,招聘市場的 “金三銀四” 也悄然而至。公眾號的小伙伴問我有沒有面試相關指導課程,上完課后,把整理的部分材料通過文章分享給更多有需要的朋友。預祝大家順利獲得心儀的職位。本文將從簡歷準備、面試注意事項以及高頻面試問題三個方面,為你提供一份全面的風…

字符串判空錯誤

字符串判空錯誤 前端傳來的請求數據&#xff0c;若用只用String為null判斷&#xff0c;則忽略了str“”的情況&#xff0c;此時str不空&#xff0c;但str.length()0 RequestMapping(path "/add", method RequestMethod.POST)ResponseBodypublic String addDiscuss…

C++進階(二) 多態

一、多態的概念 多態的概念&#xff1a;通俗來說&#xff0c;就是多種形態&#xff0c; 具體點就是去完成某個行為&#xff0c;當不同的對象去完成時會 產生出不同的狀態。舉個栗子&#xff1a;比如買票這個行為&#xff0c;當普通人買票時&#xff0c;是全價買票&#xff1b;學…

Linux 查詢端口被占用命令

Linux 查詢端口被占用命令 1、lsof -i:端口號 用于查看某一端口的占用情況&#xff0c;比如查看8000端口使用情況&#xff0c;lsof -i:8000 lsof -i:8080&#xff1a;查看8080端口占用 lsof abc.txt&#xff1a;顯示開啟文件abc.txt的進程 lsof -c abc&#xff1a;顯示abc進…

Java中的List

List集合的特有方法 方法介紹 方法名描述void add(int index,E element)在此集合中的指定位置插入指定的元素E remove(int index)刪除指定索引處的元素&#xff0c;返回被刪除的元素E set(int index,E element)修改指定索引處的元素&#xff0c;返回被修改的元素E get(int inde…

動態規劃5,粉刷房子,買賣股票的最佳時期

粉刷房子 思路&#xff1a; 1.經驗題目要求 dp[i][0] 表示&#xff1a;粉刷到 i 位置的時候&#xff0c;最后一個位置粉刷上紅色&#xff0c;此時的最小花費。 dp[i][1] 表示&#xff1a;粉刷到 i 位置的時候&#xff0c;最后一個位置粉刷上藍色&#xff0c;此時的最小花費。…

mybatis開發一個分頁插件、mybatis實現分頁、mybatis攔截器

mybatis開發一個分頁插件、mybatis實現分頁、mybatis攔截器 通過官網的mybatis插件說明可知&#xff0c;我們可以通過攔截器進行開發一個插件。 例如這樣的&#xff1a; UserMapper mapper sqlSession.getMapper(UserMapper.class);// 開始分頁MagicPage.startPage(1, 3);//…

Javascript:類型轉換

一、前言 prompt與表達單取過來的值默認為string類型 二、正文 1.隱式轉換 某些運算符被執行的時候&#xff0c;系統內部自動將數據類型進行轉換。 規則&#xff1a; 好兩邊只要有一個是字符串&#xff0c;都會把另外一個轉成字符串。 除了以外的算術運算符&#xff0c;比如…

Linux:線程的概念

個人主頁 &#xff1a; 個人主頁 個人專欄 &#xff1a; 《數據結構》 《C語言》《C》《Linux》 文章目錄 前言一、線程的概念線程代碼的簡單示例 總結 前言 本文是對于線程概念的知識總結 一、線程的概念 在課本上&#xff0c;線程是比進程更輕量級的一種指向流 或 線程是在…

VS Code 的粘性滾動預覽 - 類似于 Excel 的凍結首行

VS Code 的粘性滾動預覽 - 類似于 Excel 的凍結首行功能&#xff0c;即滾動 UI 顯示當前源代碼范圍。便于在代碼行數比較多的時候更好的知道自己所在的位置。粘性滾動UI 顯示用戶在滾動期間所處的范圍&#xff0c;將顯示編輯器頂部所在的類/接口/命名空間/函數/方法/構造函數&a…