飛越面試官(二)--JUC

????大家好!我是本號(hào)唯一官方指定沒頭屑的小便--。

JUC是什么東西?我相信很多經(jīng)驗(yàn)尚淺的小伙伴部分都會(huì)為之一懵,我也是,三個(gè)字母都會(huì)讀,連在一起就不知道在說什么,其實(shí)如果把它的全稱寫出來,“java.util.concurrent”,這就很清楚了。這個(gè)jar包的內(nèi)容就是,atomic類、volatile、cas、concurrentHashMap、CountDownLatch、CyclicBarrier、Semaphore、實(shí)現(xiàn)Callable接口創(chuàng)建線程,ReentrantLock同步鎖,ReadWriteLock讀寫鎖,線程池。

圍繞上面列舉的JUC下的類,幾乎都是面試的重災(zāi)區(qū),不問才是奇怪。

ReentrantLock了解嗎?嗯。功能如其名,它是一把鎖,而且還是可重入的,這個(gè)和synchriozed是類似的。它作用于代碼片段,可以通過lock方法去競(jìng)爭(zhēng)鎖,當(dāng)然也提供了順序上鎖的形式,這synchriozed是做不到的,它的底層原理是AQS,釋放鎖要使用unlock方法,否則會(huì)一直阻塞改代碼判斷,同時(shí)也提供了一些方法用于感知鎖的狀態(tài)和響應(yīng)中斷,還可以通過condition來喚醒指定的線程。

你說AQS?是的,它位于java.util.concurrent.locks包下,AQS是一個(gè)用來構(gòu)建鎖和同步器的框架,例如ReentrantLock和Semaphore等等,原理是被請(qǐng)求的共享資源空閑,那么當(dāng)前空閑的線程就會(huì)被標(biāo)記為運(yùn)行狀態(tài),資源也被標(biāo)記為被鎖定,需要一套線程阻塞等待以及被喚醒時(shí)鎖分配的機(jī)制,AQS使用CLH隊(duì)列鎖(自旋鎖,先來先服務(wù),保證無饑餓)實(shí)現(xiàn),即將暫時(shí)獲取不到鎖的線程放在隊(duì)列中。

簡(jiǎn)單說下CAS吧!全稱就是compare and swap,通過保存一個(gè)舊值,更新時(shí)用舊值來比較當(dāng)前值,沒有改變則更新為更新后的值。像atomicInteger就是利用volatile修飾值,然后使用上面說的cas這個(gè)方法來做。

concurrentHashMap是怎么保證線程安全的?與Hashtable不同,concurrentHashMap不會(huì)鎖住整個(gè)表,JDK7及之前是做了一個(gè)分段鎖,將表分成16段,每段單獨(dú)加鎖,每段的里面是一個(gè)不會(huì)互相干擾的數(shù)組。JDK8以及之后,分段鎖的做法成了CAS加synchroized,段里面的數(shù)組超過8個(gè)之后會(huì)成為紅黑樹。

Volatile的作用?它可以?保證每個(gè)線程都可以獲取到最新的值,或者說是從主內(nèi)存中讀取的值。同時(shí)也可以用于阻止指令重排,像一個(gè)變量初始,第一步是開辟內(nèi)存,第二步是內(nèi)存賦值,第三步是內(nèi)存指向引用。第二和第三步是可以不一定的取決于JVM,用了volatile之后不會(huì)調(diào)換這個(gè)步驟。

用沒用過多線程呢?按我理解,用了線程池和CountDownLatch之類的,也就是用過多線程了。這里說下ContDownLatch,它可以用于控制指定數(shù)量線程的開始,通過調(diào)用countDown方法標(biāo)記執(zhí)行完成,最后調(diào)用await方法,阻塞等待最后一個(gè)線程執(zhí)行完畢。這個(gè)可以用于應(yīng)用中發(fā)起多個(gè)請(qǐng)求同時(shí)執(zhí)行的需求。

除了CountDownLatch,還有CycliBarrier柵欄,柵欄是一個(gè)比CountDownLatch更進(jìn)一步的線程控制方案,在指定線程數(shù)量執(zhí)行到一定數(shù)量的時(shí)候,才能進(jìn)行下一步。就好比,老師布置了作業(yè),接著大家就開始做,做完的就交作業(yè),老師等到了最后一個(gè)交作業(yè)的同學(xué)交上來,然后老師拿著全部寫好的作業(yè)又分了下去給各個(gè)同學(xué)去改,全部改完了大家又交了上來,老師收齊了所有的作業(yè)后,可以翻一下試卷找找最高分什么的,然后又讓同學(xué)們給發(fā)下去,最后一張?jiān)嚲戆l(fā)完,事情就結(jié)束了。

另外一些高級(jí)工具像信號(hào)量Semaphore和Phaser移相器,感覺Semaphore和線程池類似,Phaser和柵欄也類似。

線程池?可以說說為什么要用線程池嗎?使用池化技術(shù),它是有好處的!第一個(gè)減少創(chuàng)建和銷毀線程的開銷,利于復(fù)用,第二個(gè)任務(wù)不用等創(chuàng)建線程就可以運(yùn)行,第三個(gè)就是可以管理、調(diào)優(yōu)和監(jiān)控線程的運(yùn)行。這里很有必要提一下線程池的運(yùn)用,Java提供四種內(nèi)置的創(chuàng)建線程池的方法,雖然都被阿里規(guī)范認(rèn)為不要用為好,避免OOM。有newFixedThreadExecutor,但有等待隊(duì)列過大造成OOM的可能、ScheduleThreadExecutor、newSingleThreadExecutor,newCacheThreadExecutor,有創(chuàng)建線程過大導(dǎo)致OOM風(fēng)險(xiǎn)。這個(gè)時(shí)候只能上自定義的線程池了,自定義線程池通過ThreadPoolExecutor創(chuàng)建,參數(shù)包括核心線程數(shù)、最大線程數(shù)、銷毀核心線程數(shù)之外的線程的等待時(shí)間、等待隊(duì)列、線程工廠、拒絕策略。其中拒絕策略又包括直接拋異常,拋棄最老的,直接丟棄,由調(diào)用者自己執(zhí)行。

????????線程池可以執(zhí)行實(shí)現(xiàn)了Runable和Callable接口的線程,不需要返回結(jié)果的時(shí)候使用execute方法,需要返回結(jié)果的時(shí)候執(zhí)行submit方法,返回結(jié)果要與Future結(jié)合使用,用get得到執(zhí)行結(jié)果的時(shí)候,會(huì)阻塞線程直到執(zhí)行完成。

補(bǔ)充:

談一下Java的異常?它們都是Throwable的子類,Error基本就是程序掛掉了,得人工介入排查。Exception也分運(yùn)行時(shí)和非運(yùn)行時(shí)異常,非運(yùn)行時(shí)異常需要catch處理,例如IO操作。運(yùn)行時(shí)異常,例如下標(biāo)越界,空指針,類不存在,方法不存在,數(shù)字格式異常。

第一版Java面試知識(shí)點(diǎn)匯總下載(有不少錯(cuò)別字和沒更新的):https://pan.baidu.com/s/1MxKXIZtoBd57pTwTIDyrgA 提取碼: 3arb。

相關(guān)閱讀:

飛越面試官(一)--Java基礎(chǔ)

重磅!兩萬字Java面試知識(shí)點(diǎn)匯總發(fā)布

?著作權(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)容

  • 下面最近發(fā)的一些并發(fā)編程的文章匯總,通過閱讀這些文章大家再看大廠面試中的并發(fā)編程問題就沒有那么頭疼了。今天給大家總...
    架構(gòu)師springboot閱讀 807評(píng)論 0 3
  • 前言 這篇文章主要是對(duì)多線程的問題進(jìn)行總結(jié)的,因此羅列了40個(gè)多線程的問題。 這些多線程的問題,有些來源于各大網(wǎng)站...
    java成功之路閱讀 867評(píng)論 0 9
  • 前言 個(gè)人認(rèn)為,學(xué)習(xí),內(nèi)容越多、越雜的知識(shí),越需要進(jìn)行深刻的總結(jié),這樣才能記憶深刻,將知識(shí)變成自己的。這篇文章主要...
    堯淳閱讀 750評(píng)論 0 17
  • 前言 Java多線程分類中寫了21篇多線程的文章,21篇文章的內(nèi)容很多,個(gè)人認(rèn)為,學(xué)習(xí),內(nèi)容越多、越雜的知識(shí),越需...
    jackcooper閱讀 707評(píng)論 1 16
  • 過幾天就要報(bào)名教師資格證考試,是時(shí)候準(zhǔn)備看書備戰(zhàn)國考嚕... 可是我竟然方了 從哪里開始看啊 加油?。∠胂朊磕甓紩?huì)...
    大風(fēng)小雨閱讀 339評(píng)論 0 0

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