58

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

相關文章
相關標籤/搜索