線程可見性:
- 線程和cpu核心一對一
運(yùn)行的時(shí)候,會(huì)從主存讀取到cpu寄存器中,也就是線程本地緩存(區(qū)別于threadlocalthreadlocal而是一個(gè)線程內(nèi)部的存儲(chǔ)類,可以在指定線程內(nèi)存儲(chǔ)數(shù)據(jù),數(shù)據(jù)存儲(chǔ)以后,只有指定線程可以得到存儲(chǔ)數(shù)據(jù),可以不恰當(dāng)?shù)谋扔鳛閙ap),運(yùn)行時(shí)在線程本地緩存讀寫修改數(shù)據(jù)。
這樣會(huì)出現(xiàn)兩個(gè)線程修改一個(gè)數(shù)據(jù)可能不同步,使用volatile可以解決這個(gè)問題
volatile維持線程的可見性,立刻同步多線程數(shù)據(jù)緩存 - 怎么理解超線程,雙核四線程?
cpu中一個(gè)計(jì)算單元對應(yīng)兩組數(shù)據(jù)寄存器,就叫做超線程
雙核四線程就是2個(gè)cpu,在每個(gè)cpu內(nèi)部有一個(gè)計(jì)算單元,每個(gè)計(jì)算單元都對應(yīng)兩組數(shù)據(jù)寄存器,這樣就是雙核四線程; - CPU的構(gòu)成
image.png
因?yàn)榧拇嫫魉俣群椭鞔娌罹噍^大,所以cpu有三級(jí)緩存
image.png
三級(jí)緩存L3有兩個(gè)CPU核共享(多核共享),二級(jí)緩存L2和一級(jí)緩存L1在一個(gè)CPU核中;
當(dāng)需要讀取數(shù)據(jù)x到寄存器中進(jìn)行計(jì)算,會(huì)依次去L1,L2,L3中讀取,如果沒有,從主存中讀出x緩存到L1,L2,L3中,下次可以直接從緩存中快速找到。
在程序加載的時(shí)候,或者緩存沒有數(shù)據(jù)的時(shí)候,數(shù)據(jù)緩存是一塊一塊從主存加載到緩存中,回加載比較多的數(shù)據(jù),這一塊就叫cache line,一般是64字節(jié)大?。ê蚦pu數(shù)據(jù)總線有一定關(guān)系);
image.png
緩存一致性協(xié)議(intel-mesi msi mosi等)保持多顆CPU用到同一塊(cache line)數(shù)據(jù)的一致性,會(huì)導(dǎo)致互相同步;
線程有序性
cpu級(jí)別,匯編級(jí)別指令可能會(huì)重排序(不影響最后結(jié)果的前提下),原因是為了提高效率;
image.png
亂序存在的條件:
- as-if-serial
- 不影響單線程的最終一致性
并發(fā)
lock 臨界區(qū) 悲觀鎖 重量級(jí)鎖
自旋鎖 樂觀鎖 輕量級(jí)鎖
image.png
- cas 的ABA問題
對象引用的ABA問題,可能導(dǎo)致引用對象變了,版本號(hào)和時(shí)間戳可以解決ABA問題 - cas操作本身的原子性保障




