并發(fā)題

線(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)程池的工作流程

線(xiàn)程池執(zhí)行流程

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){

????????}

????}

}

```

可以看到国撵,同步代碼塊的方法,字節(jié)碼添加了monitorenter與monitorexit命令

2玻墅、sync是直接通過(guò)加鎖介牙,屬于悲觀鎖,而Lock使用CAS機(jī)制澳厢,是樂(lè)觀鎖环础。

3、sync會(huì)自動(dòng)釋放鎖剩拢,而lock需要手動(dòng)釋放线得,并且需要try、catch徐伐、finally中最終釋放(防止死鎖)

synchronized?原理

Java的對(duì)象存儲(chǔ)主要分為以下三個(gè)部分:

實(shí)例對(duì)象內(nèi)存結(jié)構(gòu)贯钩,其中實(shí)例變量存儲(chǔ)對(duì)象的屬性信息以及父類(lèi)的屬性信息(如果是數(shù)組還會(huì)存儲(chǔ)數(shù)組的長(zhǎng)度),填充數(shù)據(jù)(JVM要求對(duì)象的起始地址必須是8字節(jié)的倍數(shù)办素,所以用來(lái)字節(jié)對(duì)齊角雷,知道即可),而對(duì)象頭則是synchornized實(shí)現(xiàn)的基礎(chǔ)

對(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ù)也有所不同。

MarkWord64位的存儲(chǔ)結(jié)構(gòu)胯舷,根據(jù)對(duì)象狀態(tài)的不同刻蚯,存儲(chǔ)的結(jié)構(gòu)會(huì)發(fā)生變化

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


正常狀態(tài)的對(duì)象MarkWord

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í)行效率是非常高的驻襟。


偏向鎖狀態(tài)的MarkWord

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)程厢蒜,而是記錄棧幀中的鎖記錄。


輕量鎖的MarkWord

4烹植、當(dāng)更多的線(xiàn)程來(lái)競(jìng)爭(zhēng)鎖時(shí),輕量鎖將升級(jí)為重量鎖愕贡,此時(shí)MarkWord記錄一個(gè)監(jiān)視器的對(duì)象(ObjectMintor)


重量鎖的MarkWord

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)忙迁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市碎乃,隨后出現(xiàn)的幾起案子姊扔,更是在濱河造成了極大的恐慌,老刑警劉巖梅誓,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恰梢,死亡現(xiàn)場(chǎng)離奇詭異佛南,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)嵌言,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)嗅回,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人摧茴,你說(shuō)我怎么就攤上這事绵载。” “怎么了苛白?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵娃豹,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我丸氛,道長(zhǎng)培愁,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任缓窜,我火速辦了婚禮定续,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘禾锤。我一直安慰自己私股,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布恩掷。 她就那樣靜靜地躺著倡鲸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪黄娘。 梳的紋絲不亂的頭發(fā)上峭状,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音逼争,去河邊找鬼优床。 笑死,一個(gè)胖子當(dāng)著我的面吹牛誓焦,可吹牛的內(nèi)容都是我干的胆敞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼杂伟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼移层!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起赫粥,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤观话,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后傅是,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體匪燕,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蕾羊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了帽驯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片龟再。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖尼变,靈堂內(nèi)的尸體忽然破棺而出利凑,到底是詐尸還是另有隱情,我是刑警寧澤嫌术,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布哀澈,位于F島的核電站,受9級(jí)特大地震影響度气,放射性物質(zhì)發(fā)生泄漏割按。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一磷籍、第九天 我趴在偏房一處隱蔽的房頂上張望适荣。 院中可真熱鬧,春花似錦院领、人聲如沸弛矛。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)丈氓。三九已至,卻和暖如春强法,著一層夾襖步出監(jiān)牢的瞬間万俗,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工饮怯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留该编,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓硕淑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親嘉赎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子置媳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353