java多線程面試總結(jié)


volatile作用(必考)

volatile在多處理器開發(fā)中保證了共享變量的“ 可見性”??梢娦缘囊馑际钱?dāng)一個(gè)線程修改一個(gè)共享變量時(shí),另外一個(gè)線程能讀到這個(gè)修改的值。(共享內(nèi)存,私有內(nèi)存)

Atomic類如何保證原子性(CAS操作)(必考)

synchronized和Lock的區(qū)別(必考)

首先synchronized是java內(nèi)置關(guān)鍵字在jvm層面,Lock是個(gè)java類。

synchronized無法判斷是否獲取鎖的狀態(tài),Lock可以判斷是否獲取到鎖,并且可以主動(dòng)嘗試去獲取鎖。

synchronized會(huì)自動(dòng)釋放鎖(a 線程執(zhí)行完同步代碼會(huì)釋放鎖 ;b 線程執(zhí)行過程中發(fā)生異常會(huì)釋放鎖),Lock需在finally中手工釋放鎖(unlock()方法釋放鎖),否則容易造成線程死鎖。

用synchronized關(guān)鍵字的兩個(gè)線程1和線程2,如果當(dāng)前線程1獲得鎖,線程2線程等待。如果線程1阻塞,線程2則會(huì)一直等待下去,而Lock鎖就不一定會(huì)等待下去,如果嘗試獲取不到鎖,線程可以不用一直等待就結(jié)束了。

synchronized的鎖可重入、不可中斷、非公平,而Lock鎖可重入、可判斷、可公平(兩者皆可)

Lock鎖適合大量同步的代碼的同步問題,synchronized鎖適合代碼少量的同步問題。

為什么要使用線程池(必考)

減少創(chuàng)建和銷毀線程的次數(shù),每個(gè)工作線程都可以被重復(fù)利用,可執(zhí)行多個(gè)任務(wù)。

可以根據(jù)系統(tǒng)的承受能力,調(diào)整線程池中工作線程的數(shù)目,放置因?yàn)橄倪^多的內(nèi)存,而把服務(wù)器累趴下。

核心線程池ThreadPoolExecutor的參數(shù)(必考)

ThreadPoolExecutor的工作流程(必考)

Java SPI

由于雙親委派模型損失了一丟丟靈活性。就比如java.sql.Driver這個(gè)東西。JDK只能提供一個(gè)規(guī)范接口,而不能提供實(shí)現(xiàn)。提供實(shí)現(xiàn)的是實(shí)際的數(shù)據(jù)庫(kù)提供商。提供商的庫(kù)總不能放JDK目錄里吧。Java從1.6搞出了SPI就是為了優(yōu)雅的解決這類問題——JDK提供接口,供應(yīng)商提供服務(wù)。編程人員編碼時(shí)面向接口編程,然后JDK能夠自動(dòng)找到合適的實(shí)現(xiàn)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容