1. 程式人生 > >部分面試題總結1

部分面試題總結1

https://www.nowcoder.com/discuss/132259?type=2&order=0&pos=16&page=1
一、執行緒池的底層怎麼實現的?
執行緒池作用:
1、降低資源消耗
2、提高相應速度
3、提高穩定性
實現類ThreadPoolExecutor類
有幾個重要的引數:
corePoolSize:核心執行緒池大小。預設情況下執行緒池中沒有執行緒,當需要任務時才建立執行緒去執行任務。
當數量達到滿值時會把任務放到快取佇列中。
keepAliveTime:在沒有任務執行時執行緒的存活時間。預設只有在執行緒池大於核心池大小時才會起作用,呼叫方法可以改變為不大於也會起作用。
unit:keepAliveTime的時間單位。
MaximumSize:執行緒池能存放執行緒的最大值。
workQueue:一個阻塞佇列,用來存放等待執行的任務。
threadFactory:執行緒工廠,用於建立執行緒。
handler:表示當拒絕處理任務時的策略。
有幾個比較重要的方法:
execute():向執行緒池中提交一個任務,交由執行緒池去執行
submit():也是向執行緒池提交一個任務,不同的是可以返回任務的結果返回值,在這個方法的實現中還是呼叫的execute方法
shutdown():執行緒處於SHUTDOWN狀態,執行緒池不會接受新任務,結束當前所有任務後關閉執行緒池
shutdownNow():執行緒池處於STOP狀態,會嘗試終止當前任務並關閉執行緒池
比較重要的變數:
RUNNING:初始狀態
SHUTDOWN:執行緒池不能接受新任務,會等待所有任務執行
STOP:執行緒池不能接受新任務,並會嘗試終止當前任務
TEAMINATED:執行緒池處於SHUTDOWN或STOP狀態,且所有工作程序已經銷燬,任務快取佇列已經清空或結束後,執行緒池被設定為TEAMINATED
二、lock底層實現,原始碼


實現類為ReentrantLock類,
有幾個重要的方法:
lock():加鎖,如果已經被獲取則等待
tryLock():嘗試獲取鎖,獲取則返回true,否則false
tryLock(long time,keepAliveTime unit):在規定時間內獲取鎖
Unlock();解鎖
lockInterruptly():如果執行緒正在等待釋放鎖,可以中斷這一過程
還有實現類ReentrantReadWrite類
readLock():
writeLock():
三、synchronized底層實現
JVM中物件的存放有三塊區域:物件頭、例項資料、對齊填充
物件頭:hashcode、分代年齡、鎖標記位
1、程式碼塊的底層實現
對程式碼塊新增synchronized關鍵字後,在底層JVM虛擬機器進行編譯時會在該程式碼塊前後新增monitorenter和monitorexit
在執行monitorenter時,系統會獲取物件的物件頭中的monitor,獲取後將計數器記為1,表示加鎖,執行完到monitorexit減1,表示釋放鎖
如果在獲取monitorenter時失敗,那就要等待鎖被另一個執行緒釋放。
2、方法的底層實現
對方法新增synchronized關鍵字後,在底層JVM虛擬機器中不是之前的monitor,而是ACC_SYNCHRONIZED標識,JVM通過該標識辨別一個方法是否為同步方法