2020最新JAVA核心面試知識整理283頁(帶詳解)

部分目錄預覽
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
部分內容預覽

JVM 類加載機制

JVM 類加載機制分爲五個部分:加載,驗證,準備,解析,初始化,下面我們就分別來看一下這五個過程。
在這裏插入圖片描述

  • 加載
    加載是類加載過程中的一個階段,這個階段會在內存中生成一個代表這個類的java.lang.Class 對象,作爲方法區這個類的各種數據的入口。注意這裏不一定非得要從一個Class 文件獲取,這裏既可以從ZIP 包中讀取(比如從jar 包和war 包中讀取),也可以在運行時計算生成(動態代理),也可以由其它文件生成(比如將JSP 文件轉換成對應的Class 類)。
  • 驗證
    這一階段的主要目的是爲了確保Class 文件的字節流中包含的信息是否符合當前虛擬機的要求,並且不會危害虛擬機自身的安全。
  • 準備
    準備階段是正式爲類變量分配內存並設置類變量的初始值階段,即在方法區中分配這些變量所使用的內存空間。注意這裏所說的初始值概念,比如一個類變量定義爲:
    public static int v = 8080;
    實際上變量v 在準備階段過後的初始值爲0 而不是8080,將v 賦值爲8080 的put static 指令是程序被編譯後,存放於類構造器方法之中。
    但是注意如果聲明爲:
    public static final int v = 8080;
    在編譯階段會爲v 生成ConstantValue 屬性,在準備階段虛擬機會根據ConstantValue 屬性將v賦值爲8080。
  • 解析
    解析階段是指虛擬機將常量池中的符號引用替換爲直接引用的過程。符號引用就是class 文件中的:
  1. CONSTANT_Class_info
  2. CONSTANT_Field_info
  3. CONSTANT_Method_info
    等類型的常量。

volatile關鍵字的作用(變量可見性、禁止重排序)

Java 語言提供了一種稍弱的同步機制,即volatile 變量,用來確保將變量的更新操作通知到其他線程。volatile 變量具備兩種特性,volatile 變量不會被緩存在寄存器或者對其他處理器不可見的地方,因此在讀取volatile 類型的變量時總會返回最新寫入的值。

  • 變量可見性
    其一是保證該變量對所有線程可見,這裏的可見性指的是當一個線程修改了變量的值,那麼新的值對於其他線程是可以立即獲取的。
  • 禁止重排序
    volatile 禁止了指令重排。
    比 sychronized 更輕量級的同步鎖
    在訪問volatile 變量時不會執行加鎖操作,因此也就不會使執行線程阻塞,因此volatile 變量是一種比sychronized 關鍵字更輕量級的同步機制。volatile 適合這種場景:一個變量被多個線程共享,線程直接給這個變量賦值。
    在這裏插入圖片描述
    當對非 volatile 變量進行讀寫的時候,每個線程先從內存拷貝變量到CPU 緩存中。如果計算機有多個CPU,每個線程可能在不同的CPU 上被處理,這意味着每個線程可以拷貝到不同的 CPUcache 中。而聲明變量是 volatile 的,JVM 保證了每次讀變量都從內存中讀,跳過 CPU cache這一步。
    適用場景
    值得說明的是對volatile 變量的單次讀/寫操作可以保證原子性的,如long 和double 類型變量,但是並不能保證i++這種操作的原子性,因爲本質上i++是讀、寫兩次操作。在某些場景下可以代替Synchronized。但是,volatile 的不能完全取代Synchronized 的位置,只有在一些特殊的場景下,才能適用volatile。總的來說,必須同時滿足下面兩個條件才能保證在併發環境的線程安全:
    (1)對變量的寫操作不依賴於當前值(比如 i++),或者說是單純的變量賦值(booleanflag = true)。
    (2)該變量沒有包含在具有其他變量的不變式中,也就是說,不同的volatile 變量之間,不能互相依賴。只有在狀態真正獨立於程序內其他內容時才能使用 volatile。

Spring MVC 原理

Spring 的模型-視圖-控制器(MVC)框架是圍繞一個DispatcherServlet 來設計的,這個Servlet會把請求分發給各個處理器,並支持可配置的處理器映射、視圖渲染、本地化、時區與主題渲染等,甚至還能支持文件上傳。
在這裏插入圖片描述
Http 請求到 DispatcherServlet
(1) 客戶端請求提交到DispatcherServlet。
HandlerMapping 尋找處理器
(2) 由DispatcherServlet 控制器查詢一個或多個HandlerMapping,找到處理請求的
Controller。
調用處理器 Controller
(3) DispatcherServlet 將請求提交到Controller。
Controller 調用業務邏輯處理後,返回 ModelAndView
(4)(5)調用業務處理和返回結果:Controller 調用業務邏輯處理後,返回ModelAndView。
DispatcherServlet 查詢 ModelAndView
(6)(7)處理視圖映射並返回模型: DispatcherServlet 查詢一個或多個ViewResoler 視圖解析器,找到ModelAndView 指定的視圖。
ModelAndView 反饋瀏覽器 HTTP
(8) Http 響應:視圖負責將結果顯示到客戶端。

由於內容太多,這裏就不一一列舉了,還是將整個文件送給各位吧,希望能幫助到大家!
獲取完整PDF文件,請在微信公衆號【Java技術精選】的後臺回覆“面試”兩個字
如果您覺得本篇文章對您有幫助,請點贊,轉發給更多的人吧
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章