1.JDK動態代理實現原理 可手寫或者簡述html
一、InvocationHandler
每個動態代理類都必需要實現InvocationHandler這個接口,而且每一個代理類的實例都關聯了一個handler,當咱們經過代理對象調用一個方法的時候,這個方法的調用就會被轉發爲由InvocationHandler這個接口的 invoke 方法來進行調用。咱們來看看InvocationHandler這個接口的惟一一個方法 invoke 方法:redis
Object invoke(Object proxy, Method method, Object[] args) throws Throwable
1
咱們看到這個方法一共接受三個參數,那麼這三個參數分別表明以下:算法
proxy: 指代JDK動態生成的最終代理對象
method: 指代的是咱們所要調用真實對象的某個方法的Method對象
args: 指代的是調用真實對象某個方法時接受的參數
二、Proxy
Proxy這個類的做用就是用來動態建立一個代理對象的類,它提供了許多的方法,可是咱們用的最多的就是 newProxyInstance 這個方法:數組
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException
這個方法的做用就是獲得一個動態的代理對象,其接收三個參數,咱們來看看這三個參數所表明的含義:緩存
loader: 一個ClassLoader對象,定義了由哪一個ClassLoader來對生成的代理對象進行加載
interfaces: 一個Interface對象的數組,表示的是我將要給我須要代理的對象提供一組什麼接口,若是我提供了一組接口給它,那麼這個代理對象就宣稱實現了該接口(多態),這樣我就能調用這組接口中的方法了
一個InvocationHandler對象,表示的是當我這個動態代理對象在調用方法的時候,會關聯到哪個InvocationHandler對象上
其實咱們所說的DynamicProxy(動態代理類)是這樣一種class:它是在運行時生成的class,在生成它時你必須提供一組interface給它,而後該class就宣稱它實現了這些 interface。如此一來,咱們能夠把該class的實例看成這些interface中的任何一個來用(能夠強轉爲相應的接口類型)。固然,這個DynamicProxy其實就是一個Proxy,它不會作實質性的工做,在生成它的實例時你必須提供一個handler,由它接管實際的工做。服務器
https://blog.csdn.net/xiaokang123456kao/article/details/77679848多線程
2.多線程的在Java中CycliBarriar和CountdownLatch有什麼區別併發
3.AOP和IOC項目中的應用,及AOP的切面實現原理高併發
https://www.cnblogs.com/liuruowang/p/5711563.html.net
4.服務CPU高怎麼排查,及經常使用排查命令及做用
1.top 查看哪一個進程佔用CPU多
2.查看此進程下的全部的線程狀況
ps -mp 18257 -o THREAD,tid,time
3.查看該線程的堆棧狀況,先將線程id轉爲16進制,使用printf 「%x\n」 tid命令進行轉換,由於線程堆棧狀況記錄的是線程的16進制id
printf "%x\n" 18357
4.而後根據該id經過命令 jstack pid |grep tid -A 30(pid:進程id,tid:線程id)
5.查看磁盤命令 df -h
6.經過命令du -sh *查看具體文件夾佔用內存狀況
https://blog.csdn.net/lonyness/article/details/82628988
5.高併發下redis緩存穿透問題解決方案
6.堆和棧的區別
1.棧內存存儲的是局部變量而堆內存存儲的是實體;
2.棧內存的更新速度要快於堆內存,由於局部變量的生命週期很短;
3.棧內存存放的變量生命週期一旦結束就會被釋放,而堆內存存放的實體會被垃圾回收機制不定時的回收。
7.手寫工廠模式和單例模式
8.線程池實現原理
https://www.cnblogs.com/dongguacai/p/6030187.html
一、線程是稀缺資源,使用線程池能夠減小建立和銷燬線程的次數,每一個工做線程均可以重複使用。
二、能夠根據系統的承受能力,調整線程池中工做線程的數量,防止由於消耗過多內存致使服務器崩潰。
1 public ThreadPoolExecutor(int corePoolSize, 2 int maximumPoolSize, 3 long keepAliveTime, 4 TimeUnit unit, 5 BlockingQueue<Runnable> workQueue, 6 RejectedExecutionHandler handler)
corePoolSize:線程池核心線程數量
maximumPoolSize:線程池最大線程數量
keepAliverTime:當活躍線程數大於核心線程數時,空閒的多餘線程最大存活時間
unit:存活時間的單位
workQueue:存聽任務的隊列
handler:超出線程範圍和隊列容量的任務的處理程序
提交一個任務到線程池中,線程池的處理流程以下:
一、判斷線程池裏的核心線程是否都在執行任務,若是不是(核心線程空閒或者還有核心線程沒有被建立)則建立一個新的工做線程來執行任務。若是核心線程都在執行任務,則進入下個流程。
二、線程池判斷工做隊列是否已滿,若是工做隊列沒有滿,則將新提交的任務存儲在這個工做隊列裏。若是工做隊列滿了,則進入下個流程。
三、判斷線程池裏的線程是否都處於工做狀態,若是沒有,則建立一個新的工做線程來執行任務。若是已經滿了,則交給飽和策略來處理這個任務。
9.CAS算法原理
https://www.cnblogs.com/jianzh5/p/6671230.html