java多線程

一、前言

計(jì)算機(jī)組成原理

計(jì)算機(jī)操作系統(tǒng)

數(shù)據(jù)結(jié)構(gòu)與算法

備注:相聲有四門基本功:說不从、學(xué)惜姐、逗、唱椿息;編程也有四門基本功:機(jī)組原理歹袁、操作系統(tǒng)、數(shù)據(jù)結(jié)構(gòu)預(yù)算法寝优、計(jì)算機(jī)網(wǎng)絡(luò)

二条舔、知識儲備

1、什么是進(jìn)程乏矾、什么是線程

進(jìn)程: CPU分配資源的基本單位孟抗。如何判斷CPU運(yùn)行的進(jìn)程個數(shù)迁杨?即一個多核CPU有多少個待CPU執(zhí)行的任務(wù),就有多少個進(jìn)程正在運(yùn)行(即有多少的程序/PID)夸浅。

線程: CPU執(zhí)行的基本單位仑最。如何判斷CPU運(yùn)行的線程個數(shù)?即每一個進(jìn)程有多少基本單位在執(zhí)行帆喇。

2警医、當(dāng)代cpu與存儲器結(jié)構(gòu)及速率比較

CPU包含:ALU<1ns(算術(shù)邏輯單元)、L0<1ns(寄存器)坯钦、L1≈1ns(一級緩存)预皇、L2≈3ns(二級緩存)、L3≈15ns(三級緩存)

存儲器包含:L0<1ns(寄存器)婉刀、L1≈1ns(一級緩存)吟温、L2≈3ns(二級緩存)、L3≈15ns(三級緩存)突颊、L4≈80ns(內(nèi)存/主存)鲁豪、L5(磁盤)、L6(遠(yuǎn)程文件服存儲等)


3律秃、CPU爬橡、內(nèi)存、南北橋棒动、PCI總線的運(yùn)行邏輯

北橋:靠近CPU的為北橋芯片糙申,主要負(fù)責(zé)控制AGP顯卡、內(nèi)存與CPU之間的數(shù)據(jù)交換船惨;

南橋:靠近PCI槽的為南橋芯片柜裸,主要負(fù)責(zé)鼠標(biāo)、硬盤粱锐、鍵盤疙挺、網(wǎng)卡以及附加卡的數(shù)據(jù)交換。

關(guān)系:傳統(tǒng)的南北橋架構(gòu)是通過PCI總線來連接的


4怜浅、cpu是亂序執(zhí)行的衔统,并且多核cpu存在緩存同步

證明cpu是亂序執(zhí)行的(CPU層級)

證明JVM存在指令重排(Hotsport層級)

證明cpu存在緩存同步,即存在MESI緩存一致性協(xié)議(OS層級)

5海雪、數(shù)據(jù)結(jié)構(gòu)、算法及理論

雙向鏈表

隊(duì)列

CLH

AQS

CAS

自旋

6舱殿、java的Unsafe操作

unpark();

park();

compareAndSwapObject();

...

三奥裸、線程的生命周期

1、java有幾種創(chuàng)建線程方式沪袭?

a湾宙、本質(zhì)上只有兩種創(chuàng)建線程的方式

集成Thread類

實(shí)現(xiàn)Runnable接口

b樟氢、其他基于以上兩種方式創(chuàng)建線程的外在表現(xiàn)

lambda表達(dá)式

Future接口

Callable接口

ThreadPool

2、如何正確啟動線程侠鳄?

正確:start()

錯誤:run()

3埠啃、如何正確停止線程?

正確:interrupt()

錯誤:stop()

4伟恶、線程生命周期的狀態(tài)是如何轉(zhuǎn)換的碴开?

a、new -> runnable -> terminated

b博秫、runnable -> blocked -> runnable

c潦牛、runnable -> waiting -> runnable

d、runnable -> time_waiting -> runnable

四挡育、多線程安全

1巴碗、什么是線程安全

當(dāng)多個線程訪問一個對象時,如果不用考慮這些線程在運(yùn)行時環(huán)境下的調(diào)度和交替執(zhí)行即寒,也不需要進(jìn)行額外的同步橡淆,或者在調(diào)用方進(jìn)行任何其他的協(xié)同操作,調(diào)用這個對象的行為都可以獲得正確的結(jié)果母赵,那這個對象是線程安全的逸爵。——《Java Concurrency In Practice》

2市咽、多線程三大特性

原子性:即一個操作或者多個操作 要么全部執(zhí)行并且執(zhí)行的過程不會被任何因素打斷痊银,要么就都不執(zhí)行。

可見性:當(dāng)多個線程訪問同一個變量時施绎,一個線程修改了這個變量的值溯革,其他線程能夠立即看得到修改的值。

有序性:程序執(zhí)行的順序按照代碼的先后順序執(zhí)行谷醉。

3致稀、synchronized

要點(diǎn):加鎖實(shí)現(xiàn)原子性

a、java代碼層級:

加了synchronized關(guān)鍵字

b俱尼、字節(jié)碼層級:

加了monitorenter抖单, monitorexit

c、hotspot層級:


d遇八、匯編碼層級

重量級鎖添加lock

4矛绘、volatile

要點(diǎn):匯編 lock 實(shí)現(xiàn)了 volatile 的「防止指令重排」「內(nèi)存可見」的特性

a、java代碼層級

加了volatile關(guān)鍵字

b刃永、字節(jié)碼層級

屬性上添加ACC_Volatile修飾

c货矮、hotspot層級

內(nèi)存屏障java規(guī)范

在每個volatile寫操作的前面插入一個StoreStore屏障。

在每個volatile寫操作的后面插入一個StoreLoad屏障斯够。

在每個volatile讀操作的后面插入一個LoadLoad屏障囚玫。

在每個volatile讀操作的后面插入一個LoadStore屏障喧锦。

as-if-serial 原則

happens-before 原則

源碼:

inline void OrderAccess::fence() {

? // always use locked addl since mfence is sometimes expensive

#ifdef AMD64

? __asm__ volatile ("lock; addl $0,0(%%rsp)" : : : "cc", "memory");

#else

? __asm__ volatile ("lock; addl $0,0(%%esp)" : : : "cc", "memory");

#endif

? compiler_barrier();

}

d、匯編碼層級

lock addl $0x0,(%rsp)

e抓督、OS層級

lock會觸發(fā)緩存一致性協(xié)議燃少,使用到該緩存行的其他cpu核的緩存失效。

5铃在、AQS之ReentrantLock

五阵具、實(shí)戰(zhàn)

1、DCL單例

2涌穆、兩個線程交替打印

3怔昨、多線程校驗(yàn),盡快返回宿稀。即只要有一個線程false趁舀,停止其它線程。

4祝沸、死鎖

5矮烹、發(fā)布逸出

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市罩锐,隨后出現(xiàn)的幾起案子奉狈,更是在濱河造成了極大的恐慌,老刑警劉巖涩惑,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仁期,死亡現(xiàn)場離奇詭異,居然都是意外死亡竭恬,警方通過查閱死者的電腦和手機(jī)跛蛋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來痊硕,“玉大人赊级,你說我怎么就攤上這事〔沓瘢” “怎么了理逊?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長盒揉。 經(jīng)常有香客問我晋被,道長,這世上最難降的妖魔是什么刚盈? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任墨微,我火速辦了婚禮,結(jié)果婚禮上扁掸,老公的妹妹穿的比我還像新娘翘县。我一直安慰自己,他們只是感情好谴分,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布锈麸。 她就那樣靜靜地躺著,像睡著了一般牺蹄。 火紅的嫁衣襯著肌膚如雪忘伞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天沙兰,我揣著相機(jī)與錄音氓奈,去河邊找鬼。 笑死鼎天,一個胖子當(dāng)著我的面吹牛舀奶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播斋射,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼育勺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了罗岖?” 一聲冷哼從身側(cè)響起涧至,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎桑包,沒想到半個月后南蓬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哑了,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年赘方,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垒手。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡蒜焊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出科贬,到底是詐尸還是另有隱情泳梆,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布榜掌,位于F島的核電站优妙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏憎账。R本人自食惡果不足惜套硼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胞皱。 院中可真熱鬧邪意,春花似錦九妈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至策菜,卻和暖如春晶疼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背又憨。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工立膛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瞄桨,地道東北人寝受。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓蝇闭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親浪秘。 傳聞我的和親對象是個殘疾皇子蒋情,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354