線(xiàn)程池使用的是哪種
ThreadPoolExecutor: 核心線(xiàn)程數(shù)炉擅、最大線(xiàn)程數(shù)、存活時(shí)間阳惹、ThreadFactory、BlockingQueue任務(wù)隊(duì)列眶俩、RejectedExecutionHandler拒絕策略
4種拒絕策略:當(dāng)隊(duì)列(有界隊(duì)列)任務(wù)已滿(mǎn)時(shí)的處理方式
1莹汤、AbortPolicy,丟棄任務(wù)并拋出RejectedExecutionExecption
2颠印、DiscardPolicy纲岭,丟棄任務(wù)但不拋出異常
3、DiscardOldestPolicy线罕,丟棄隊(duì)列最前面的任務(wù)止潮,然后嘗試重新執(zhí)行任務(wù)
4点把、CallerRunsPolicy激捏,由調(diào)用線(xiàn)程處理任務(wù)
線(xiàn)程池參數(shù)怎么配置
參上
線(xiàn)程池各個(gè)參數(shù)的作用
參上
線(xiàn)程池的參數(shù)配置要注意什么
創(chuàng)建線(xiàn)程池建議采用new ThreadPoolExecutor,而不是采用Executor提供的方法來(lái)創(chuàng)建,因?yàn)镋xecutor提供的創(chuàng)建方式線(xiàn)程最大數(shù)量是Integer.MAX漾橙,可能會(huì)造成OOM询件。
線(xiàn)程池的工作流程
JDK 中的并發(fā)類(lèi)知道哪些
Java并發(fā)包c(diǎn)oncurrent包下的:
1燃乍、Lock, 樂(lè)觀鎖操作
2宛琅、阻塞隊(duì)列
3刻蟹、原子操作類(lèi)
4、線(xiàn)程池:Executors
5嘿辟、信號(hào)量:CountDownLatch舆瘪、CyclicBarrier等
AQS 的底層原理
介紹下悲觀鎖和樂(lè)觀鎖
使用過(guò)哪些鎖?
syncronized
RenrtrrentLock:重入鎖红伦,sync和RentrentLock都是重入鎖英古,重入鎖是為了解決線(xiàn)程死鎖問(wèn)題。
CAS
synchronized?和?Lock?的區(qū)別色建、使用場(chǎng)景
1哺呜、sync是jvm層面處理的,是一個(gè)關(guān)鍵字,而Lock是一個(gè)類(lèi)
當(dāng)使用sync同步代碼塊的時(shí)候某残,可以通過(guò)查看class字節(jié)碼看到:
```
public class SyncDemo{
? ? public synchronized void test1(){
????}
? ? public void test2(){
? ? ? ? synchronized (this){
????????}
????}
}
```
2玻墅、sync是直接通過(guò)加鎖介牙,屬于悲觀鎖,而Lock使用CAS機(jī)制澳厢,是樂(lè)觀鎖环础。
3、sync會(huì)自動(dòng)釋放鎖剩拢,而lock需要手動(dòng)釋放线得,并且需要try、catch徐伐、finally中最終釋放(防止死鎖)
synchronized?原理
Java的對(duì)象存儲(chǔ)主要分為以下三個(gè)部分:
對(duì)象頭包括兩部分?jǐn)?shù)據(jù):MarkWord以及類(lèi)型指針(Class MetaData Address)指向當(dāng)前對(duì)象的類(lèi)元數(shù)據(jù)
MarkWord是非固定結(jié)構(gòu)的數(shù)據(jù)性穿,主要存儲(chǔ)了對(duì)象的HashCode勺三、鎖狀態(tài)、鎖標(biāo)記位等需曾,根據(jù)對(duì)象的鎖狀態(tài)吗坚,鎖存儲(chǔ)的數(shù)據(jù)也有所不同。
JDK1.6之前,僅有重量級(jí)鎖的概念桑嘶,重量級(jí)鎖也就是同步鎖炊汹,會(huì)造成線(xiàn)程阻塞,并且會(huì)使線(xiàn)程在用戶(hù)態(tài)與核心態(tài)頻繁切換逃顶,影響效率讨便。而在JDK1.6,JVM對(duì)synchnorized做了較大的優(yōu)化以政,引入了偏向鎖霸褒、輕量鎖。對(duì)象不會(huì)一創(chuàng)建就處于重量級(jí)鎖的狀態(tài)盈蛮,而是按照一定的規(guī)則升級(jí)废菱。
鎖升級(jí)過(guò)程:
1、對(duì)象在創(chuàng)建初期,此時(shí)沒(méi)有任何線(xiàn)程競(jìng)爭(zhēng)殊轴,lock的標(biāo)記位是01衰倦,偏向鎖標(biāo)記位0
2、當(dāng)有線(xiàn)程來(lái)競(jìng)爭(zhēng)鎖時(shí)旁理,將升級(jí)為偏向鎖樊零,在標(biāo)記字(MarkWord)中記錄該線(xiàn)程的ID,此后該線(xiàn)程訪問(wèn)此對(duì)象時(shí)不需要再做任何檢驗(yàn)和切換孽文,此時(shí)的線(xiàn)程執(zhí)行效率是非常高的驻襟。
3、當(dāng)有兩個(gè)線(xiàn)程來(lái)競(jìng)爭(zhēng)鎖時(shí)芋哭,將升級(jí)為輕量鎖沉衣,即兩個(gè)線(xiàn)程公平競(jìng)爭(zhēng)鎖,誰(shuí)先獲得鎖就獲得了代碼的執(zhí)行楷掉。MarkWord將不再記錄偏向線(xiàn)程厢蒜,而是記錄棧幀中的鎖記錄。
4烹植、當(dāng)更多的線(xiàn)程來(lái)競(jìng)爭(zhēng)鎖時(shí),輕量鎖將升級(jí)為重量鎖愕贡,此時(shí)MarkWord記錄一個(gè)監(jiān)視器的對(duì)象(ObjectMintor)
synchronized?作用于靜態(tài)方法草雕、普通方法、this固以、Lock.class?的區(qū)別
靜態(tài)方法墩虹,鎖的是this.class(類(lèi)對(duì)象),普通方法鎖的是this
為什么引入偏向鎖、輕量級(jí)鎖憨琳,介紹下升級(jí)流程
升級(jí)流程如上上個(gè)問(wèn)題
死鎖的必要條件诫钓,如何預(yù)防死鎖
1、互斥條件:一個(gè)資源只能被一個(gè)線(xiàn)程占有
2篙螟、請(qǐng)求與保持條件:至少保持了一個(gè)占有資源菌湃,又去請(qǐng)求其它的資源,此時(shí)線(xiàn)程阻塞遍略,但是對(duì)已獲得的資源不釋放
3惧所、不可剝奪條件:線(xiàn)程已經(jīng)獲取的資源,不能被其它線(xiàn)程占有绪杏,只能等待當(dāng)前線(xiàn)程主動(dòng)釋放
4下愈、循環(huán)等待條件:若干線(xiàn)程形成收尾相接循環(huán)等待的關(guān)系
破壞死鎖:由于線(xiàn)程的互斥是不可改變的,那么只能從其它三個(gè)方面去破壞死鎖蕾久。
1势似、破壞不可剝脫條件:當(dāng)發(fā)現(xiàn)不能獲取執(zhí)行所需的全部資源時(shí),則處于等待狀態(tài),當(dāng)可以獲取到全部資源時(shí)履因,才執(zhí)行障簿。
2、破壞請(qǐng)求保持:
3搓逾、破壞循環(huán)等待:將資源進(jìn)行編號(hào)卷谈,按照資源緊缺,越緊缺編號(hào)越大霞篡,只有當(dāng)線(xiàn)程可以獲取到編號(hào)最小的資源時(shí)世蔗,才執(zhí)行。
介紹下 CountDownLatch?和 CyclicBarrier
兩者都是用來(lái)做同步輔助控制的朗兵,CountDownLatch污淋,執(zhí)行的當(dāng)前線(xiàn)程會(huì)處于阻塞狀態(tài),等到所有線(xiàn)程都執(zhí)行完畢余掖,才會(huì)進(jìn)入下一步寸爆,不可循環(huán)。而CyclicBarrier執(zhí)行的當(dāng)前線(xiàn)程不會(huì)阻塞盐欺,是一種異步操作赁豆,而且是可循環(huán)的。
介紹下 CAS冗美,存在什么問(wèn)題
?CAS魔种,Compare And Swap 比較并替換。
是一種樂(lè)觀鎖粉洼,在更新數(shù)據(jù)的時(shí)候节预,將數(shù)據(jù)與內(nèi)存中的數(shù)據(jù)進(jìn)行比較,如果發(fā)現(xiàn)一致属韧,則可以更新為新的值安拟,不一致則獲取最新的值并重新執(zhí)行以上流程。
1宵喂、ABA問(wèn)題糠赦,內(nèi)存中的值可能經(jīng)過(guò)A 修改為B 后又修改為A,如果僅僅比較值樊破,可能是一樣的愉棱,那么這種改變對(duì)程序是不可見(jiàn)的,可以通過(guò)加版本號(hào)解決哲戚,每次修改奔滑,將版本號(hào)加1
2、自旋問(wèn)題:某個(gè)線(xiàn)程可能會(huì)一直處于自旋(循環(huán))狀態(tài)顺少,此時(shí)的CPU開(kāi)銷(xiāo)是比較大的
介紹下 ThreadLocal朋其,存在什么問(wèn)題
同一個(gè)ThreadLocal對(duì)象在不同線(xiàn)程中有不同的數(shù)據(jù)副本王浴,其數(shù)據(jù)結(jié)構(gòu)采用ThreadLocalMap實(shí)現(xiàn),每個(gè)線(xiàn)程創(chuàng)建的時(shí)候梅猿,set數(shù)據(jù)的時(shí)候氓辣,會(huì)有線(xiàn)程作為key,vlaue作為值存入ThreadLocalMap中
存在問(wèn)題:
1袱蚓、ThreadLocalMap的key采用的是弱引用钞啸,可以保證在在線(xiàn)程執(zhí)行完畢之后key可以被回收,但是value是強(qiáng)引用喇潘,任然需要手動(dòng)回收体斩,否則可能會(huì)造成內(nèi)存泄漏。
2颖低、線(xiàn)程池?cái)?shù)據(jù)錯(cuò)亂:因?yàn)楝F(xiàn)在使用的基本都是線(xiàn)程池絮吵,那么在不同的時(shí)間執(zhí)行的方法使用的線(xiàn)程可能是同一個(gè),如果在ThreadLocal中set了值而沒(méi)有清理忱屑,則可能會(huì)造成數(shù)據(jù)錯(cuò)亂蹬敲,使用remove來(lái)清理數(shù)據(jù)保證數(shù)據(jù)干凈。
使用場(chǎng)景:?
1莺戒、Spring采用ThreadLocal解決事務(wù)控制的問(wèn)題:一個(gè)業(yè)務(wù)方法中伴嗡,可能調(diào)用了很多個(gè)Mapper接口的方法,要實(shí)現(xiàn)事務(wù)控制从铲,必須保證這些Mapper使用的數(shù)據(jù)庫(kù)連接是同一個(gè)闹究。 同時(shí)Spring的事務(wù)傳播機(jī)制不同,事務(wù)的處理邏輯也是不一樣的食店。比如:A方法調(diào)用B方法,? A的事務(wù)處理與B的事務(wù)處理邏輯分開(kāi)赏寇,那么A方法和B方法所使用的數(shù)據(jù)庫(kù)連接則不能是同一個(gè)吉嫩。
2、數(shù)據(jù)傳輸:一個(gè)變量在多個(gè)類(lèi)嗅定、方法都使用到自娩,要保證其線(xiàn)程安全,可以通過(guò)方法傳遞的方式渠退,也可以通過(guò)ThreadLocal來(lái)實(shí)現(xiàn)忙迁。