本文首發於cartoon的博客
轉載請註明出處:cartoonyu.github.io/cartoon-blo…java
java
-
對synchronized的瞭解git
- java的一個關鍵字,用於重量級鎖的設定
- 利用synchronized關鍵字,能夠實現對互斥資源的訪問
- 做用範圍
- 普通方法,鎖的粒度爲當前對象
- 靜態方法,鎖的粒度爲當前類的class對象
- 代碼塊,鎖的粒度爲括號內使用的對象
-
多線程的同步機制github
- 使用同步代碼塊synchronized
- 經過標誌位輪詢訪問臨界資源
- 經過Condition以及lock對資源的鎖定以及釋放
- 經過阻塞隊列BlockQueue(生產者/消費者)
-
threadLocal的概念以及使用場景redis
- 每一個線程都能擁有該變量的獨立副本
- 內部經過ThreadLocalMap進行值的存儲以及讀取
- 初始容量爲16
- 負載因子爲2/3
- 經過再hash法解決hash衝突
-
final,finally,finalize的區別算法
- final爲不可變修飾詞,用於聲明屬性,方法或類不可變
- finally爲異常捕獲機制一部分,老是會被執行。若try或catch有return語句,finally早於此return語句執行
- finalize爲Object方法,調用此方法能夠實現資源的回收,可是回收時間由JVM決定
-
java註解的做用spring
- 生成文檔
- 完成特定的標識(@Service等)
- 在編譯時進行格式檢查(@Override)
-
java集合間的區別sql
- set與list都只含單個元素,而Map含有key-value對
- Map將entry數組置爲null,就是set,因此set內元素是無序的,list元素是有序的
-
BIO NIO AIO的區別數據庫
- BIO
- 同步阻塞
- 線程阻塞進行運算後返回結果
- NIO
- 同步非阻塞
- 請求共用一個線程進行處理
- 線程會直接返回結果到請求
- AIO
- 異步非阻塞
- 線程處理後會經過回調返回結果
-
java反射機制的理解編程
- 做用
- 在程序運行中,動態獲取對象所屬類,屬性以及方法等信息
- 在程序運行時,動態改變對象屬性
- 動態代理以及靜態代理
jvm
- 怎麼判斷對象是否可回收?
- 引用計數法
- 可達性分析算法(GC ROOT)
- java內存區域劃分
- 運行時數據區域
- 線程共享
- 方法區
- 棧
- 線程隔離區
- 虛擬機棧
- 本地方法棧
- 程序計數器
數據庫
- MyBatis分頁方式以及區別
- 邏輯分頁
- 數組分頁
- RowBounds分頁
- 物理分頁
- sql分頁
- 攔截器分頁
- 數據庫事務特性以及隔離級別
- 特性
- 原子性(Atomicity)
- 事務執行結果是一致的,成功或者回滾
- 一致性(Consistency)
- 事務執行先後數據庫狀態不受影響
- 隔離性(Isolation)
- 事務間操做相互獨立
- 持久性
- 事務執行產生的結果是永久存儲下來的
- 隔離級別
- read uncommitted
- 讀取事務未提交的數據
- read commited
- 屢次查詢某一數據結果不一致
- repeatable
- 同時修改同一元素形成事務提交結果發生誤差
- serializable
- 事務的順序執行
- redis的數據類型以及底層數據結構
- string
- 經過DDS(簡單的動態字符串)實現
- DDS的實現經過雙端鏈表實現
- hash
- 壓縮列表(數據量較小)
- key-value對少於512個且全部鍵對大小都要小於64字節
- 散列表
- 鏈地址法解決衝突
- set
- 有序數組
- 數據都是整數
- 元素個數不超過512個
- 散列表
- list
- 壓縮列表
- 雙循環鏈表
- 全部數據大小小於64字節
- 數據個數小於128個
- 有序集合
- 壓縮列表
- 相似於數組,存儲空間是連續的,可是元素所佔空間不惟一
- 雙循環鏈表
- 緩存穿透的概念,解決方法
- 緩存穿透是指請求訪問不存在的key,請求穿透到DB,流量大會形成DB崩潰
- 解決方法
- 採用布隆過濾器或者BitMap對請求進行過濾
- 緩存雪崩的概念,解決方法
- 大量key設置統一過時時間,形成瞬間DB訪問量過大
- 解決方法
- key的過時時間用隨機數進行設置
- 緩存擊穿的概念,解決方法
- 存在key在緩存失效的瞬間被大量請求訪問,形成DB請求量大
- 解決方法
- 設置短時間key替代原始key
- key再生成後刪除短時間key
spring
- AOP,IOC的概念
- AOP
- AOP面向切面編程,它將本來縱向的程序看做成一個個切面的組合,是OOP的補充
- 動態插入執行邏輯到原有執行流程中
- 通知(Advice):具體實現邏輯
- 鏈接點(JoinPoint):使用通知的位置
- 切入點(PointCut):指定使用通知的鏈接點位置
- 切面(Aspect):通知與切入點集合
- 引入(introduction):添加新方法屬性到現有類中
- 目標(target):被通知的對象
- 代理(proxy)
- 靜態代理
- 動態代理
- 織入(weaving):將切面引用到目標對象生成代理對象的過程
- IOC
- 我把IOC稱做爲控制反轉或者依賴注入,IOC是Spring的核心思想,它使調用者不用管理對象的生存週期以及具體實現,可以更加註重於業務邏輯的實現。
- 在平時實際開發中,我一般使用向上轉型的對象完成業務邏輯,這樣我以爲能使對象中的耦合度下降,並且在代碼重構的時候可以輕易切換實現類。
- Spring bean的做用域
- singleton
- prototype
- session
- request
- global session
- Spring bean是線程安全嗎?
- prototype,request每次被調用都會建立新對象,不存在線程問題
- singleton,session,globalSession會形成線程間競爭,無狀態bean是線程安全的,有狀態beanSpring經過ThreadLocal進行解決
- spring mvc的執行流程
- 請求經過http到達後端,由DispatcherServlet進行分發
- DispatchServlet經過HandlerMapping查找處理的Controller,中間或者會有過濾器等進行處理
- 若是在查找過程當中發生錯誤,HandlerExceptionResolver會返回一個HandlerExecutionChain對象到DispathchServlet
- 請求正確分發到Controller,Controller調用Service以及Repository等進行處理,調用RequestAndViewNameResolver處理後返回ModelAndView對象到DispatchServlet
- DispatchServlet根據返回的ModelAndView對象,將對象交給ViewResolver組件進行視圖的渲染,若是在語言上有特殊要求,渲染會調用LocaleResolver以及ThemeResolver進行國際化的適配
網絡
-
Session與cookie的區別後端
- cookie存儲在客戶端,session存儲在服務器
- cookie只能存儲字符串,session能夠存儲任意對象
- cookie的存儲大小受客戶端影響,大小爲4KB,session存儲大小不受影響
- 後端獲取cookie經過http報文中的cookie字段獲取,session則經過cookie中的sessionId標識尋找
-
session的工做原理
- session是存儲在服務器端的一種標識客戶端的數據結構
- 用戶請求到達後臺,後臺檢測是否有sessionId字段的存在
- 有的話,校驗字段是否合法
- 沒有的話,建立新session並返回對應sessionId到客戶端
-
TCP與UDP區別
- TCP面向鏈接,UDP不面向鏈接
- TCP有擁塞控制,UDP沒有擁塞控制
- TCP資源開銷大,UDP資源開銷小
- TCP只支持一對一,UDP支持一對多
- TCP提供可靠傳輸,UDP儘量交付
- TCP面向字節流,UDP面向報文
-
tcp粘包的緣由以及解決辦法
- 緣由
- 不一樣數據包在到達接收方時首尾部粘在一塊兒
- 解決方法
- 在每一個tcp報文首部添加報文長度
- 在報文的首部或者尾部設置特殊的符號位標識
-
tcp的三次握手與四次揮手
- 三次握手(鏈接過程)
- 一次握手(客戶端發起)
- 建立TCB
- 發送SYN=1,seq=x
- 進入SYN-SENT
- 二次握手(服務器發起)
- 發送ACK=1,syn=1,ack=y+1,seq=x+1
- 進入SYN-RCVD
- 三次握手(客戶端發起)
- 發送ACK=1,seq=x+1,ack=x+1
- 進入ESTABLISHED
- 四次揮手(結束鏈接過程)
- 一次揮手
- 客戶端發送FIN=1,seq=u爲內容的請求報文
- 客戶端進入FIN-SENT-1狀態
- 二次揮手
- 服務器端發送ACK=1,seq=v,ack=u+1爲內容的確認報文
- 服務器端進入CLOSE_WAIT
- 客戶端進入FIN-SENT-2狀態
- 三次揮手
- 服務器端發送FIN=1,seq=w,ACK=1,ack=u+1爲內容的釋放報文
- 服務器端進入LAST_ACK狀態
- 四次揮手
- 客戶端發送ACK=1,ack=w+1,seq=u+1爲內容的確認報文
- 客戶端進入TIME_WAIT狀態,等待2MSL後關閉鏈接
- 服務器端接受報文後關閉鏈接
設計模式
- 抽象工廠與簡單工廠的區別
- 抽象工廠定義建立產品的大概流程,子工廠經過繼承抽象工廠負責具體產品的建立,產品種類的增長不須要改變抽象工廠的代碼邏輯
- 簡單工廠負責具體產品的建立,產品種類的增長鬚要改變建立的邏輯
算法
- 快速排序實現
- 主要採用分治的思想
- 定義左右指針遍歷元素(左右指針的初始值爲邊界)
- 循環遍歷數組(左指針小於右指針)
- 循環遍歷左指針直到元素大於右指針指向的元素
- 交換左右指針的元素值
- 循環遍歷右指針直到元素小於小指針指向的元素
- 交換左右指針的元素值
- 返回左指針的值做爲中線
- 分別遞歸中線左右,依據2,3的步驟進行處理