前言
看日期,今天都是4月了,這春招也差不多進入尾聲了。
近期任有不少朋友都在找工作,很多人開始抱怨,工作可真難找啊!身邊不少朋友問我咋搞呀,秋招都要結束了,工作還沒著落呢…額…這個…今年是有點難啊。說實話,面試只是對個人技術及應變能力的一次考驗。只有解決了一個問題,你才有機會遇見下一個問題。
這不,今天我總結了餓了么4面(Java崗)面經,問題如下,都是真真的經歷,準備面試找工作的朋友可自行檢測一下。
并發歷史
在計算機最早期的時候,沒有操作系統,執行程序只需要一個過程,那就是從頭到尾依次執行。任何資源都會為這個程序服務,這必然就會存在?浪費資源
?的情況。
這里說的浪費資源指的是資源空閑,沒有充分使用的情況。
操作系統為我們的程序帶來了?并發性
,操作系統使我們的程序同時運行多個程序,一個程序就是一個進程,也就相當于同時運行了多個進程。
操作系統是一個并發系統
,并發性是操作系統非常重要的特征,操作系統具有同時處理和調度多個程序的能力,比如多個 I/O 設備同時在輸入輸出;設備 I/O 和 CPU 計算同時進行;內存中同時有多個系統和用戶程序被啟動交替、穿插地執行。操作系統在協調和分配進程的同時,操作系統也會為不同進程分配不同的資源。
操作系統實現多個程序同時運行解決了單個程序無法做到的問題,主要有下面三點
資源利用率
,我們上面說到,單個進程存在資源浪費的情況,舉個例子,當你在為某個文件夾賦予權限的時候,輸入程序無法接受外部的輸入字符,只能等到權限賦予完畢后才能接受外部輸入。綜合來講,就是在等待程序時無法執行其他工作。如果在等待程序的同時可以運行另一個程序,那么將會大大提高資源的利用率。(資源并不會覺得累)因為它不會劃水~公平性
,不同的用戶和程序對于計算機上的資源有著同樣的使用權。一種高效的運行方式是為不同的程序劃分時間片使用資源,但是有一點需要注意,操作系統可以決定不同進程的優先級,雖然每個進程都有能夠公平享有資源的權利,但是每次前一個進程釋放資源后的同時有一個優先級更高的進程搶奪資源,就會造成優先級低的進程無法獲得資源,久而久之會導致進程饑餓。便利性
,單個進程是無法通信的,通信這一點我認為其實是一種避雷針
策略,通信的本質就是信息交換
,及時進行信息交換能夠避免信息孤島
,做重復性的工作;任何并發能做的事情,順序編程也能夠實現,只不過這種方式效率很低,它是一種?阻塞式
?的。
但是,順序編程(也稱為串行編程
)也不是一無是處
的,串行編程的優勢在于其直觀性和簡單性,客觀來講,串行編程更適合我們人腦的思考方式,但是我們并不會滿足于順序編程,we want it more!!!?。資源利用率、公平性和便利性促使著進程出現的同時也促使著線程
的出現。
如果你還不是很理解進程和線程的區別的話,那么我就以我多年操作系統的經驗(吹牛逼,實則半年)來為你解釋一下:進程是一個應用程序,而線程是應用程序中的一條順序流。
線程會共享進程范圍內的資源,例如內存和文件句柄,但是每個線程也有自己私有的內容,比如程序計數器、棧以及局部變量。下面匯總了進程和線程共享資源的區別
線程被描述為一種輕量級
的進程,輕量級體現在線程的創建和銷毀要比進程的開銷小很多。
注意:任何比較都是相對的。
在大多數現代操作系統中,都以線程為基本的調度單位,所以我們的視角著重放在對線程的探究。
線程
優勢和劣勢
合理使用線程是一門藝術,合理編寫一道準確無誤的多線程程序更是一門藝術,如果線程使用得當,能夠有效的降低程序的開發和維護成本。
在 GUI 中,線程可以提高用戶界面的響應靈敏度,在服務器應用程序中,并發可以提高資源利用率以及系統吞吐率。
Java 很好的在用戶空間實現了開發工具包,并在內核空間提供系統調用來支持多線程編程,Java 支持了豐富的類庫?java.util.concurrent
?和跨平臺的內存模型
,同時也提高了開發人員的門檻,并發一直以來是一個高階的主題,但是現在,并發也成為了主流開發人員的必備素質。
雖然線程帶來的好處很多,但是編寫正確的多線程(并發)程序是一件極困難的事情,并發程序的 Bug 往往會詭異地出現又詭異的消失,在當你認為沒有問題的時候它就出現了,難以定位
?是并發程序的一個特征,所以在此基礎上你需要有扎實的并發基本功。那么,并發為什么會出現呢?
為什么是并發
計算機世界的快速發展離不開 CPU、內存和 I/O 設備的高速發展,但是這三者一直存在速度差異性問題,我們可以從存儲器的層次結構可以看出
CPU 內部是寄存器的構造,寄存器的訪問速度要高于高速緩存
,高速緩存的訪問速度要高于內存,最慢的是磁盤訪問。
程序是在內存中執行的,程序里大部分語句都要訪問內存,有些還需要訪問 I/O 設備,根據漏桶理論來說,程序整體的性能取決于最慢的操作也就是磁盤訪問速度。
因為 CPU 速度太快了,所以為了發揮 CPU 的速度優勢,平衡這三者的速度差異,計算機體系機構、操作系統、編譯程序都做出了貢獻,主要體現為:
- CPU 使用緩存來中和和內存的訪問速度差異
- 操作系統提供進程和線程調度,讓 CPU 在執行指令的同時分時復用線程,讓內存和磁盤不斷交互,不同的?
CPU 時間片
?能夠執行不同的任務,從而均衡這三者的差異 - 編譯程序提供優化指令的執行順序,讓緩存能夠合理的使用
我們在享受這些便利的同時,多線程也為我們帶來了挑戰,下面我們就來探討一下并發問題為什么會出現以及多線程的源頭是什么
最后分享一波,Java核心架構進階知識點
面試成功其實都是必然發生的事情,因為在此之前我做足了充分的準備工作,不單單是純粹的刷題,更多的還會去刷一些Java核心架構進階知識點,比如:JVM、高并發、多線程、緩存、Spring相關、分布式、微服務、RPC、網絡、設計模式、MQ、Redis、MySQL、設計模式、負載均衡、算法、數據結構、kafka、ZK、集群等。而這些也全被整理濃縮到了一份pdf——《Java核心架構進階知識點整理》,全部都是精華中的精華,本著共贏的心態,好東西自然也是要分享的
內容頗多,篇幅卻有限,這就不在過多的介紹了,大家可根據以上截圖自行腦補,不過這份《Java核心架構進階知識點整理pdf》以及前面P8整理的全套系列大廠面試題皆可免費分享給有需要的你,點擊這里即可免費領取文中所有資料
整理的全套系列大廠面試題皆可免費分享給有需要的你,點擊這里即可免費領取文中所有資料