部分真題
計算機組成原理
進程和線程的本質(zhì)區(qū)別摔笤?
進程: 操作系統(tǒng)分配資源的基本單位
線程:CPU調(diào)度(操作系統(tǒng)執(zhí)行)的基本單位
線程切換:線程調(diào)度院喜,需要資源占用,所以線程不宜過多
jvm級別的線程
虛擬機的線程和操作系統(tǒng)線程的對應(yīng)關(guān)系皿桑?
- hotspot jvm線程 和 內(nèi)核線程 一一對應(yīng)
- synchronized(0)紧卒,需要等待線程執(zhí)行完畢,jdk1.2之前餐禁,由OS幫忙管理線程 -- 重量級鎖
- 無鎖 - 偏向鎖 - 自旋鎖 - 重量級鎖(必須讓操作系統(tǒng)協(xié)助管理血久,即為重量級)
虛擬機管理線程方式
- 虛擬出寄存器,虛擬的PC(記錄線程切換時執(zhí)行位置)
- 管理屬于用戶控件的線程
- 輕量級的線程 - 纖程(用戶級別線程帮非。go天然支持高并發(fā)氧吐,意指天然支持纖程/協(xié)程
go routine
go關(guān)鍵詞開啟一個go routine,對應(yīng)java的runnable末盔,每次go XXX相當(dāng)于起一個個任務(wù)筑舅,扔到一個個隊列中,讓系統(tǒng)線程去執(zhí)行庄岖,協(xié)程豁翎,線程比例 為 M:N
為什么用戶級別線程提高了效率角骤?
省去了操作系統(tǒng)管理線程的步驟隅忿,省去了線程的上下文切換心剥,把切換部分放到了jvm
- CAS:compare and swap | compare and set
操作后回寫時先查看是否依然為原本值,依然保持則回寫背桐;值已經(jīng)變動則重新取值操作后再回寫(自旋鎖
优烧,樂觀鎖
) - 如何處理CAS的ABA問題:
拿出值處理回寫時,發(fā)現(xiàn)值依然為零链峭,但無法確定這個值是否是被處理過但是又回到了原始值
畦娄。如何處理?加版本弊仪! - 自旋鎖一定比重量級鎖效率高嗎熙卡?
自旋鎖原地等待,會消耗資源励饵,在線程很多驳癌,cpu切換成本過高時則效率并不高 - cas如何保證了原子性?
LOCK IF MP(nulti processor)
cpu原語支持了比較和修改的原子性役听,如果是多個cpu颓鲜,則加LOCK
,原本是鎖總線典予,現(xiàn)在是鎖北橋信號
鎖升級初步
對象new出來放到內(nèi)存中甜滨,有四個部分:markwork
8字節(jié),class pointer
類型指針瘤袖,4字節(jié)衣摩,instance
實例數(shù)據(jù),padding
對齊捂敌,補到對象空間被八整除為止(為了提高效率昭娩。
鎖對象如何實現(xiàn)?
鎖對象如何實現(xiàn)黍匾?
加鎖后的對象栏渺,markword里面會不一樣,markword中裝入了鎖信息和GC和hashcode
偏向鎖锐涯?
- 什么是偏向鎖磕诊?
偏向鎖沒有經(jīng)過競爭機制,只是將線程id號標(biāo)記上了纹腌,是一種處理機制霎终。 - 為什么有偏向鎖?
實際使用中升薯,可能只有一個線程在用莱褒,為了方便實現(xiàn),節(jié)約時間涎劈,出現(xiàn)的偏向鎖 - 偏向鎖出現(xiàn)競爭怎么辦广凸?
當(dāng)有線程競爭時阅茶,先進行偏向鎖撤銷,轉(zhuǎn)化為自旋鎖谅海,占用者優(yōu)先持有脸哀,其他線程以cas方式競爭,依然是記錄線程id號的方式競爭鎖扭吁。 - 使用偏向鎖是否一定提升效率撞蜂?(偏向鎖為什么需要延遲4秒鐘?)
明確知道存在競爭時(比如jvm啟動時)侥袜,無需打開偏向鎖蝌诡,因為鎖轉(zhuǎn)為自選鎖也是需要占用資源的,確定空閑時(默認(rèn)4s)再打開偏向鎖 - lock 和 synchronized區(qū)別枫吧?
lock有公平鎖送漠,synchronized沒有公平鎖 - 什么是公平鎖和非公平鎖?
公平鎖(Fair):加鎖前檢查是否有排隊等待的線程由蘑,優(yōu)先排隊等待的線程闽寡,先來先得
非公平鎖(Nonfair):加鎖時不考慮排隊等待問題,直接嘗試獲取鎖尼酿,獲取不到自動到隊尾等待
公平鎖和非公平鎖
超線程
什么是超線程爷狈?
一個運算單元(ALU)對應(yīng)兩組寄存器(單核多線程),這時的兩個線程被同一個運算單元服務(wù)裳擎,此為超線程
CPU緩存和內(nèi)存
工業(yè)實踐涎永,3層最合適
緩存一致性問題
緩存行大小64字節(jié)
緩存一致性協(xié)議,保證緩存行的一致性
為了避免緩存行中不出現(xiàn)兩個變量鹿响,從而規(guī)避同步成本羡微,可以前后懟7個longInt (8字節(jié)),保證不與其他變量在一個緩存行
緩存一致性問題
intel cpu MESI協(xié)議
volatile
- 線程可見性: MESI
- 禁止重排序:cpu執(zhí)行的指令時間遠遠小于讀取內(nèi)存時間惶我,所以在等待結(jié)果之前妈倔,會將沒有關(guān)聯(lián)關(guān)系的后續(xù)指令拿來先執(zhí)行(CPU流水線優(yōu)化),這稱為CPU亂序執(zhí)行绸贡,禁止重排序盯蝴,則會禁止這種亂序執(zhí)行(禁止部分指令之間重排序,非全部指令)
對于代碼影響就是听怕,有的賦值代碼的實際執(zhí)行順序捧挺,并不是嚴(yán)格按照代碼順序執(zhí)行的,影響的其實是匯編代碼尿瞭,但是高級語言中也可以復(fù)現(xiàn)
如何實現(xiàn)的禁止重排序闽烙?
引入一個概念,DCL
:double check lock声搁,類似cas
示例代碼:
DCL
-
上圖示例中黑竞,為什么必要加volatile捕发?
JSR內(nèi)存屏障
歡迎大家關(guān)注我的公眾號
半畝房頂