一、前言
計(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ā)布逸出