日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java面试必学-吐血推荐

發(fā)布時(shí)間:2024/2/28 java 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java面试必学-吐血推荐 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近在B站上制作了關(guān)于java面試的視頻,希望各位大佬可以給點(diǎn)指導(dǎo)意見(jiàn),作為一個(gè)老學(xué)姐,我認(rèn)為有責(zé)任把知識(shí)分享給大家

【Java學(xué)姐】SQL調(diào)優(yōu)必備Explain查看執(zhí)行計(jì)劃各項(xiàng)參數(shù)解析:https://www.bilibili.com/video/BV1iZ4y1j7Wp/

【Java面試必問(wèn)】Mysql索引/存儲(chǔ)引擎/行表鎖/分庫(kù)分表/主從復(fù)制:https://www.bilibili.com/video/BV1DK4y1C7o7/

【Java學(xué)姐】8分鐘搞懂MySQL為什么用B+樹(shù)做索引:https://www.bilibili.com/video/BV1Ka4y1t7ev/

【Java面試必問(wèn)】Redis持久化/復(fù)制/雪崩/擊穿/雙寫(xiě)一致性/過(guò)期策略:https://www.bilibili.com/video/BV1E7411S7Dh/

【JAVA學(xué)姐】10分鐘學(xué)會(huì)如何查看生產(chǎn)服務(wù)器各項(xiàng)狀態(tài)指標(biāo): https://www.bilibili.com/video/BV1s7411D7zE/

【Java面試必問(wèn)】GC垃圾回收算法: https://www.bilibili.com/video/BV1H7411Q7M8/

【Java面試必問(wèn)】JVM調(diào)優(yōu)參數(shù)解析及Java虛擬機(jī)內(nèi)存模型:? https://www.bilibili.com/video/BV1G7411Q7Hz/

【Java面試必問(wèn)】【多線程開(kāi)發(fā)必用JUC】Java并發(fā)包-JUC:? https://www.bilibili.com/video/BV14E411F7qS/

【Java面試必問(wèn)】學(xué)姐帶你學(xué)面試急救包-基礎(chǔ)講解:https://www.bilibili.com/video/BV1LE411F79v/

?

注:為節(jié)約大家的時(shí)間,可以開(kāi)啟1.5倍速觀看。

==========以下是jvm部分筆記,可觀看視頻講解=========

5、java鎖

①公平鎖:隊(duì)列先來(lái)后到? ?new ReentrantLock(true);

②非公平鎖 :可以插隊(duì)(可造成優(yōu)先級(jí)反轉(zhuǎn)和饑餓的現(xiàn)象)? ? new ReentrantLock();

③可重入鎖(遞歸鎖):ReentrantLock/Syncronized 類(lèi)似于大門(mén)鑰匙---防止死鎖

同一線程外層函數(shù)獲取鎖后,內(nèi)層遞歸函數(shù)仍然能獲取該鎖(內(nèi)層會(huì)自動(dòng)獲取鎖)

即:線程可以進(jìn)入任何一個(gè)它已經(jīng)擁有的鎖所同步著的代碼塊

④自旋鎖:嘗試獲取鎖的線程不會(huì)立即阻塞,而是采用循環(huán)的方式嘗試獲取鎖,好處:減少線程上下文切換的消耗,缺點(diǎn):循環(huán)會(huì)消耗CPU

⑤獨(dú)占鎖(寫(xiě)):該鎖一次只能被一個(gè)線程所持有。ReentrantLock/Syncronized

⑥共享鎖(讀):該鎖可被多個(gè)線程所持有。

ReentrantReadWriteLock:讀鎖是共享鎖,寫(xiě)鎖是獨(dú)占鎖。

讀鎖的共享鎖可保證并發(fā)讀是非常高效的,讀寫(xiě),寫(xiě)讀,寫(xiě)寫(xiě)的過(guò)程是互斥的。

寫(xiě)操作:原子+獨(dú)占

6、線程排序常用鎖

①CountDownLatch:秦滅六國(guó)一統(tǒng)華夏,線程減到0才執(zhí)行主線程(減法)

②CyclicBarrier:集齊7顆龍珠,可以召喚神龍(加法)

③Semaphore:信號(hào)燈,多個(gè)線程搶多份資源。示例:爭(zhēng)車(chē)位

作用:一個(gè)是用于多個(gè)共享資源的互斥使用,另一個(gè)用于并發(fā)線程數(shù)的控制

7、阻塞隊(duì)列:可以使擁擠的線程進(jìn)行等待,避免失敗率(自己理解)代碼

多線程領(lǐng)域的阻塞:在某些情況下會(huì)掛起線程(阻塞),一旦條件滿(mǎn)足,被掛起的線程又會(huì)自動(dòng)被喚醒

①阻塞隊(duì)列有沒(méi)有好的一面:BlockingQueue可以不用關(guān)心阻塞和喚醒,BlockingQueue全包

②不得不阻塞,你如何管理:

當(dāng)阻塞隊(duì)列是空時(shí),從隊(duì)列中獲取元素的操作會(huì)被阻塞

當(dāng)阻塞隊(duì)列是滿(mǎn)時(shí),往隊(duì)列里添加元素的操作會(huì)被阻塞

以上可以理解為蛋糕店成產(chǎn)蛋糕,蛋糕柜空時(shí),消費(fèi)者阻塞;當(dāng)?shù)案夤駶M(mǎn)時(shí),生產(chǎn)者阻塞

Collection的實(shí)現(xiàn)類(lèi)有List和Queue

③Queue的實(shí)現(xiàn)類(lèi)有:BlockingQueue接口

<1>ArrayBlockingQueue:由數(shù)組結(jié)構(gòu)組成的有界阻塞隊(duì)列

<2>LinkedBlockingQueue:由鏈表結(jié)構(gòu)組成的有界(大小默認(rèn)Integer.MAX_VALUE)阻塞隊(duì)列

<3>PriorityBlockingQueue:支持優(yōu)先級(jí)排序的無(wú)界阻塞隊(duì)列

<4>DelayQueue:使用優(yōu)先級(jí)隊(duì)列實(shí)現(xiàn)的延遲無(wú)界阻塞隊(duì)列

<5>SynchronousQueue:不存儲(chǔ)元素的阻塞隊(duì)列,也即單個(gè)元素的隊(duì)列

<6>LinkedTransferQueue:由鏈表結(jié)構(gòu)組成的無(wú)界阻塞隊(duì)列

<7>LinkedBlockingDeque:由鏈表結(jié)構(gòu)組成的雙向阻塞隊(duì)列

④阻塞隊(duì)列的核心方法:ArrayBlockingQueue

<1>異常:add(e),remove(),element()

<2>特殊值:offer(e) ,poll(),peek()--- 成功true,失敗false?

<3>阻塞:put(e),take()

<4>超時(shí)退出:offer(e,time,unit),poll(time,unit)

⑤阻塞隊(duì)列用在哪里?

Syncronized-ReentrantLock

【注】多線程企業(yè)級(jí)模板口訣:線程操作資源類(lèi),判斷-干活-喚醒通知,嚴(yán)防多線程狀態(tài)下的虛假喚醒

<1>生產(chǎn)者消費(fèi)者模式:

<2>線程池:

<3>消息中間件:生產(chǎn)一個(gè),消費(fèi)一個(gè)

⑥Syncronized-ReentrantLock區(qū)別

Syncronized:JVM層面,java關(guān)鍵字,底層monitor,不需要手動(dòng)釋放,

不可中斷,除非拋出異常或正常運(yùn)行完成,非公平鎖,要么喚醒一個(gè)線程,要么喚醒全部線程

ReentrantLock:api層面,類(lèi),需要手動(dòng)釋放,可中斷,可設(shè)置超時(shí)方法也可在代碼塊中調(diào)用interrupt方法,默認(rèn)非公平鎖,構(gòu)造方法傳true為公平鎖,可以用來(lái)實(shí)現(xiàn)分組喚醒需要喚醒的線程們(精確喚醒)

練習(xí):ABC三個(gè)線程,A打印5次,B打印10次,C打印15次,循環(huán)3次,按順序

8、線程池

<1>為什么要用線程池?

線程池主要是控制運(yùn)行的線程的數(shù)量,處理過(guò)程中將任務(wù)放入隊(duì)列,然后在線程創(chuàng)建后啟動(dòng)這些任務(wù),如果線程數(shù)量超過(guò)了最大數(shù)量,超出數(shù)量的線程排隊(duì)等候,等其他憲曾執(zhí)行完畢,再?gòu)年?duì)列中取出任務(wù)來(lái)執(zhí)行。

主要特點(diǎn):線程復(fù)用,控制最大并發(fā)數(shù),管理線程

<2>創(chuàng)建線程的四種方式:

繼承Thread類(lèi)

實(shí)現(xiàn)Runnable接口:無(wú)返回值,不拋異常,實(shí)現(xiàn)run方法

實(shí)現(xiàn)Callable接口:有返回值,會(huì)拋異常,實(shí)現(xiàn)call方法

通過(guò)線程池

①callable

<3>線程池框架:底層ThreadPoolExecutor

①ExecutorService threadPool = Executors.new FixedThreadPool(int)-一池固定線程數(shù)

②Executors.newSingleThreadExecutor()-一池一個(gè)線程

③Executors.newCachedThreadPool()可擴(kuò)容的一池多線程

上述三種工作中用哪種?一個(gè)都不用,用ThreadPoolExecutor自己創(chuàng)建,工具類(lèi)封裝好的有界隊(duì)列長(zhǎng)度過(guò)大

<4>線程池的7大重要參數(shù)

①corePoolSize:線程池中的核心線程數(shù)(類(lèi)似于銀行網(wǎng)點(diǎn)的窗口數(shù))

②maximumPoolSizse:線程池能夠容納同時(shí)執(zhí)行的最大線程數(shù)(類(lèi)似于銀行窗口開(kāi)放數(shù))

③keepAliveTime:多余的空閑線程的存活時(shí)間

④unit:keepAliveTime的單位

⑤workQueue:任務(wù)隊(duì)列,被提交但尚未被執(zhí)行的任務(wù)(阻塞隊(duì)列)

⑥threadFactory:表示生成線程池中工作線程的線程工廠,用于創(chuàng)建線程一般用默認(rèn)的即可

⑦h(yuǎn)andler:決絕策略,表示當(dāng)隊(duì)列滿(mǎn)了并且工作線程大于等于線程池的最大線程數(shù)

<5>線程池的底層工作原理

比如銀行辦公窗口滿(mǎn)了,阻塞隊(duì)列(候客區(qū))也滿(mǎn)了,這個(gè)時(shí)候需要擴(kuò)容銀行的加班窗口,擴(kuò)容后新進(jìn)來(lái)的會(huì)直接搶占新擴(kuò)容的加班窗口,若任務(wù)還在持續(xù)增加會(huì)啟動(dòng)飽和拒絕策略,若熱任務(wù)量下降了(多余空閑線程的存活時(shí)間)會(huì)縮容

<6>線程池的拒絕策略

AbortRolicy(默認(rèn)):直接拋出異常,阻止運(yùn)行

CallerRunsPoclicy:調(diào)用者運(yùn)行機(jī)制

DiscardOldestPolicy:拋棄隊(duì)列中等待最久的任務(wù)

DiscardPolicy:直接丟棄任務(wù),不處理也不拋異常

<7>合理配置線程池如何考慮?

CPU密集型:CPU核數(shù)+一個(gè)線程

IO密集型:

①任務(wù)線程并不是一直在執(zhí)行任務(wù),則應(yīng)配置盡可能多的線程,如CPU核數(shù)*2

②大部分線程都阻塞,需要多配置線程數(shù),參考公式:CPU核數(shù)/(1-阻塞系數(shù)) --阻塞系數(shù)在0.8~0.9之間

9、死鎖編碼及定位分析

<1>產(chǎn)生死鎖的原因:系統(tǒng)資源不足,進(jìn)程運(yùn)行推進(jìn)的順序不合適,資源分配不當(dāng)

<2>解決:jps定位進(jìn)程,jstack找到死鎖查看

總結(jié)

以上是生活随笔為你收集整理的Java面试必学-吐血推荐的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。