多線程高并發(fā)

線程可見性:

  1. 線程和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ù)緩存
  2. 怎么理解超線程,雙核四線程?
    cpu中一個(gè)計(jì)算單元對應(yīng)兩組數(shù)據(jù)寄存器,就叫做超線程
    雙核四線程就是2個(gè)cpu,在每個(gè)cpu內(nèi)部有一個(gè)計(jì)算單元,每個(gè)計(jì)算單元都對應(yīng)兩組數(shù)據(jù)寄存器,這樣就是雙核四線程;
  3. 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

亂序存在的條件:

  1. as-if-serial
  2. 不影響單線程的最終一致性

并發(fā)

lock 臨界區(qū) 悲觀鎖 重量級(jí)鎖
自旋鎖 樂觀鎖 輕量級(jí)鎖

image.png
  • cas 的ABA問題
    對象引用的ABA問題,可能導(dǎo)致引用對象變了,版本號(hào)和時(shí)間戳可以解決ABA問題
  • cas操作本身的原子性保障
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容