Java 留下沒有基礎眼淚的面試題

2021-09-13 11:43:08 字數 3592 閱讀 8833

只有光頭才能變強
使用多執行緒時,不是多執行緒能提公升程式的執行速度,使用多執行緒是為了更好地利用cpu資源

程式在執行時,多執行緒是cpu通過給每個執行緒分配cpu時間片來實現的,時間片是cpu分配給每個執行緒執行的時間,因時間片非常短,所以cpu通過不停地切換執行緒執行

執行緒不是越多就越好的,因為執行緒上下文切換是有效能損耗的,在使用多執行緒的同時需要考慮如何減少上下文切換

一般來說有以下幾條經驗

還可以考慮我們的應用是io密集型的還是cpu密集型的。

我來簡單總結一下為什麼有了mac(ip)還需要ip(mac):

已經有ip位址了,為什麼需要mac位址??

mac位址已經是唯一了,為什麼需要ip位址?

tcp 每個狀態說一下,time-wait狀態說一下
tcp總共有11個狀態,狀態之間的轉換是這樣的:

流程圖:

下面我簡單總結一下每個狀態:

fin-wait-2:主動關閉端接到ack後,就進入了fin-wait-2。在這個狀態下,應用程式還有接受資料的能力,但是已經無法傳送資料。

last_ack:當被動關閉的一方在傳送fin報文後,等待對方的ack報文的時候,就處於last_ack 狀態

closed:當收到對方的ack報文後,也就可以進入到closed狀態了。

time_wait:表示收到了對方的fin報文,並傳送出了ack報文。time_wait狀態下的tcp連線會等待2*mslclosing:罕見的狀態。表示雙方都正在關閉socket連線

time_wait狀態一般用來處理以下兩個問題:

time_wait過多怎麼解決?
如果在高併發,多短鏈結情景下,time_wait就會過多。

可以通過調整核心引數解決:vi /etc/sysctl.conf加入以下內容設定:

我們可以知道time_wait狀態是主動關閉連線的一方出現的,我們不要輕易去使用上邊兩個引數。先看看是不是可以重用tcp連線來盡量避免這個問題(比如我們http的keepalive)~

tcp是乙個可靠的傳輸協議,它要保證所有的資料報都可以到達,這需要重傳機制來支撐。

重傳機制有以下幾種:

滑動視窗可以說是tcp非常重要的乙個知識點。tcp的滑動視窗主要有兩個作用:

簡略滑動視窗示意圖:

詳細滑動視窗示意圖:

接受端控制傳送端的圖示:

tcp不是乙個自私的協議,當擁塞發生的時候,要做自我犧牲。就像交通阻塞一樣,每個車都應該把路讓出來,而不要再去搶路了
擁塞控制主要是四個演算法:

擁塞控制的作用:

擁塞的判斷:

強烈建議閱讀:

unix/linux環境下

殭屍程序:

孤兒程序:

殭屍程序危害

解決殭屍程序的手段:

首先要知道的是:程序和執行緒的關注點是不一樣的:

作業系統程序間通訊的方式有哪些?

作業系統執行緒間通訊的方式有哪些?(可以直接理解成:執行緒之間同步的方式有哪些)
執行緒間的通訊目的主要是用於執行緒同步

擴充套件閱讀:

作業系統程序排程演算法有哪些?
短程序/作業優先演算法(sjf)

最高響應比優先演算法(hrn)

最高優先數演算法

基於時間片的輪轉排程演算法

最短剩餘時間優先演算法

多級反饋排隊演算法

此部分是看別人的博文已經寫得很好了,分享給大家~

concurrenthashmap中的擴容是否需要對整個表上鎖?
總結(摘抄)要點:

什麼是一致性hash演算法(原理)?
總結(摘抄)要點:

mysql date、datetime和timestamp型別的區別
總結(摘抄)要點:

判斷乙個鍊錶是否有環(實際上就是看看有無遍歷到重複的節點),解決方式(3種):

for遍歷兩次

使用hashset做快取,記錄已遍歷過的節點

使用兩個指標,一前一後遍歷,總會出現前指標==後指標的情況

判斷兩個無環鏈表是否相交,解決方式(2種):

直接判斷兩個鍊錶的尾節點是否相等,如果相等則相交,否則不相交

判斷兩個有環鏈表是否相交(注:當乙個鍊錶中有環,乙個鍊錶中沒有環時,兩個鍊錶必不相交):

如果想看更多的
文章的目錄導航(pc端)

海量精美腦圖:

Java 留下沒有基礎眼淚的面試題

只有光頭才能變強 使用多執行緒時,不是多執行緒能提公升程式的執行速度,使用多執行緒是為了更好地利用cpu資源!程式在執行時,多執行緒是cpu通過給每個執行緒分配cpu時間片來實現的,時間片是cpu分配給每個執行緒執行的時間,因時間片非常短,所以cpu通過不停地切換執行緒執行。執行緒不是越多就越好的,...

做研究,沒有基礎怎麼行

最近做了乙個多月的乙個高維資料庫空間索引方法,後來不斷查閱 才發現,這種方法,早前10年多以前,就已經有不少人做過,甚至改進了很多。而我現在自己的想法,和前人的是如此地接近,類似。於是乎,我之前做的工作,基本上可以說是白費了,只是重複走了一遍別人在10多年前就走過的道路而已。現在總結一下,為什麼這樣...

沒有基礎如何快速學習iOS 開發?

隨著蘋果各類應用開發越來越火爆,很多開發者都轉向ios方向的學習,但是如何快速的轉向這個方向,一直是很多人的困擾。特別總結了幾點,分享給大家。第二步 您需要有足夠的熱情,可以沒有基礎,但要有熱情,否則再簡單的東西也堅持不下來,不管是要做獨立開發者,還是打算藉此提公升自身技能,沒有長期的熱情,還是別學...