1004Java面試知識點準備

單一應用型框架和分佈式架構的區別?

單一應用型框架的優缺點:
優點:網站流量小,只有一個應用(項目),所有的功能捆綁在一個應用中.部署簡單及成本低.業務簡單,開發成本小.
缺點:代碼耦合度高,開發和維護困難.服務器負載有限 .無法針對不同模塊進行鍼對性優化,單點容錯率第,併發能力差.
總結來講之前做的pv_webT項目包含移動端農戶+業務員/微信小程序/後臺管理系統代碼耦合在一起,網站流量小,部署倒是簡單,但是應用負載能力差,針對不同模塊如移動端農戶和業務員模塊需要個性化維護需要使用過濾器/攔截器進行區別話對待,針對性優化難度高,同時單個應用如農戶端業務員端出現問題,容錯率差需要整個項目都重新部署,併發上講太多功能在一個應用服務器併發能力差.

分佈式架構的優缺點:
優點:分佈式降低代碼耦合,開發人員只需瞭解自己負責的業務代碼,無需整體不相關的部分。系統可擴展性大,負載大,維護方便.
缺點:維護成本高,小公司來講分佈式架構應用部署 維護成本高.

Java中wait與sleep有什麼區別?
1.方法出處,wait方法是Object中的成員方法,sleep是Thread中的靜態方法
2.sleep可以在任何地方使用,而wait方法必須在同步代碼塊中或方法中使用否則會拋出異常
3.sleep不會釋放當前線程佔用的對象鎖,wait方法會釋放當前線程佔用的對象所,只有在調用notify或者notifyAll方法時纔可以讓線程由阻塞狀態進入可執行狀態.(因爲sleep方法使線程暫停一段執行時間,讓出cpu時間,指定等待時間過了,需要一直被監控,所以對象所不會被釋放,而wait方法放棄對象鎖,進入對象線程等待池,只有主動調用notify或者notifyAll纔會被喚醒,不需要對象監聽,所以放棄鎖.)
4.sleep方法會因爲其他線程調用intercept方法而拋出中斷異常錯誤,需要手動捕獲,而wait則沒有這個問題.
在這裏插入圖片描述
另外講述一下線程的5中狀態:分別包含創建/就緒/運行/阻塞/銷燬/
阻塞使用2中方法如wait、sleep方法.
yield線程暫停,讓優先級更高的線程優先執行.
joinf方法:線程加入.新加入的線程先執行完後,再執行當前線程.

volatile和synchronzied的作用

  1. volatile的本質是告訴jvm當前變量在寄存器中的值不確定,需要從主內存中讀取.而synchronzied是鎖定當前變量,只有當前線程可以訪問,其他線程都不可以訪問.
  2. volatile僅能使用在變量級別,而synchrozied可以在變量,方法,類中使用.
  3. volatile保證了當前的變量的多線程的可見性,但不保證原子性.而synchronzied保證了變量的可見性以及原子性.
  4. volatile修飾的變量在其他線程可以訪問,而synchronzied修飾的變量只能被當前線程訪問。
  5. volatile標記的變量不會被編譯器優化,而synchrozied修飾的變量會被編譯器優化.
    所以總結上述的volatile與sychronzied之間的區別主要在於volatile在於告訴jvm當前變量在寄存器中不確定,需要去從主內存從讀取.而synchronzied則是鎖定當前對象,只能被當前線程訪問,其他線程不可訪問.同時修飾的變量volatile範圍更小,只能是變量.而synchronzied可以修飾變量 方法和類.同時在多線程上vloatile其他線程可訪問,而synchronzied其他線程不可訪問.同時又提到一個概念就是vloatile僅保證了可見性,而synchronzied保證了可見性和原子性.同時在編譯器優化層面volatile是被優化的,而synchronzied不被優化.另外在使用過程中發現volatile使用範圍只能在類或成員方法中,而synchronzied使用範圍更廣.所以在2者的區別上無非就是作用+修飾範圍+多線程作用+編譯器優化這幾方面講.

Java中的原子類實現機制是什麼?具體原理是什麼?
採用硬件提供的原子操作指令去實現的.即CAS機制.存在三個值,內存值,預期值,比較值.通過比較內存值和預期值是否一致,如果一致,則進行數據修改.否則重試.

Spring中都用到了哪些?主要原理是什麼?
Spring框架中主要使用到了IOC,AOP.MVC.IOC指的是控制反轉,通過反射類獲取對象實例,然後在調用的時候主動注入.AOP面向切面,主要指的利用動態代理實現m,主要應用於日誌輸出,事物控制,異常處理層面(實際項目中事物控制通過ControllerAdvice控制器增強創建事物控制,達到業務層實現類發生異常事物回滾控制的目的.日誌輸出指的是利用攔截器用哪一個接口,方法,調用時間,參數等必要日誌,避免大量重複的工作。而異常處理指的是對控制層進行一個異常處理,ControllerAdvice利用該工具類實現異常處理的目的)

關於數據庫性能優化之explain指令如何使用?文章參考鏈接
explain模擬優化器執行SQL語句,從而找到SQL語句的性能瓶頸在哪裏?
通過explain執行計劃得出來的信息包含以下幾項:重要的幾項主要是id,select_type,type,key、rows、Extra.
在這裏插入圖片描述

  • id執行select子句或操作表的順序 ,如果是子查詢語句序號會遞增,而如果序號一致,表示操作表的順序.
  • select_type指的是主查詢或者子查詢的類別,如簡單查詢時SIMPLE,UNION類型.
  • type類型是性能優化的重要指標(最好能夠達到range或者ref指標以上)效率從高到底依次system>const>eq_ref>ref》range>index>ALL.
    system:指的是表中只存在一條數據.const指的是通過查詢只有一條符合記錄的數據.eq_ref指的視圖是主鍵或者唯一索引查詢出的數據.ref指的是通過通過非唯一性索引查詢出來的數據.index指的通過給定範圍查詢出的列.這種查詢相比全表索引查詢新能更好一點.index通過索引查詢全表.而All通過磁盤查找全表(新能最差)
  • possible_keys指的是如果查詢字段中如果存在索引,則列舉出來.但並不一定在實際查詢中使用.
  • key實際使用的索引,如果爲空,則沒有使用索引.
  • key_len表示索引中使用的字節數,查詢中使用的索引的長度(最大可能長度),並非實際使用長度,理論上長度越短越好。key_len是根據表定義計算而得的,不是通過表內檢索出的
    所以綜上所述:利用EXPLAIN是對SQL語句優化的重要手段,通過id,select_type,table,type,possible_key,keys.可以看出SQL語句查詢的大致結構,是否使用索引.type類型又分爲system,const,eq_ref唯一索引,ref非唯一索性.range範圍索引查詢,index,all,一般來講查詢效率必須是range以上,說白了就是必須分頁查詢不能一次性查詢過多數據,因爲查詢沒有使用索引,而全局掃描的查詢效率是很慢的,就比如之前業務員端沒有分頁查詢一樣,但是索引的使用如index,經常是聯合索引和單列索引結合使用的,如果使用了索引但實際上沒有發揮作用,效率也會很低的,那就回全表掃表如限制條件的聯合索引使用不當,這就是關於SQL語句優化的解決思路問題.

單列索引和聯合索引的理解?參考文章鏈接

  • 單列索引指的是一個字段列使用一個索引,如果在多條件查詢的時候會根據優化器的最優索引策略,可能使用一個索引,也有可能使用多個索引.但是單個單列索引會在底層創建的多個B+索引樹,浪費磁盤空間和搜索效率.
  • 多列索引a,b,c的本質是在 底層創建一個a單列索引+a,b聯合索引+a,b,c聯合索引.所以就有一個最左原則,即從左邊開始爲起點,只要是連續的索引都能匹配上,實際上a,c能夠匹配是因爲a單列索引起作用了.所以聯合索引的順序考慮非常重要,效率高的,查詢使用頻率高的放前面.a,b和b,a的效率都是有效的.

如果同時存在單列索引和多列索引優化器如何選擇?
根優化器查詢策略 ,當一條語句由多個索引可以走的時候,會根據查詢成本來決定的(如時間等).

索引使用的一些基本概念?爲什麼不在每一個列上創建索引?

  1. (索引的使用位置)索引的使用是在where限制條件裏面
  2. (索引創建字段的前提)索引的創建是基於某個字段值連續,且數據量大的情況下的.如果一個字段就2個值,沒有必要創建索引的
  3. (磁盤空間的是使用)索引的創建會在磁盤棧用空間,導致修改刪除數據的成本增高(因爲需要維護索引)
  4. (必要性)同時多個單列索引的創建,會在底層創建多個B+索引樹,搜索效率下降.同時根據業務創建一個多列索引相比多個單列索引更靠譜.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章