多執行緒的巨集觀和微觀視角

2021-09-26 05:01:34 字數 1380 閱讀 7907

首先我們在做併發程式設計的的時候會考慮到原子性丶可見性和有序性,在巨集觀上會考慮到安全性丶活躍性和效能;

執行緒工作記憶體: 是指 cpu 的 『暫存器』 和 『快取記憶體』,執行緒的 工作記憶體/本地記憶體 是指cpu的暫存器和快取記憶體的抽象描述,資料讀取順序優先順序 是:暫存器->快取記憶體->記憶體

例如:執行緒a在主存中年將變數age=0拉去到自己的工作記憶體中,然後做了age = 5,當然這個操作是在cpu的暫存器中進行的,然後寫會快取記憶體中,這時執行緒a的快取記憶體還未執行同步主記憶體的操作,執行緒b又將age=0從主存拉取到了執行緒b的工作記憶體中,導致a執行緒已經更新但是b執行緒看不到的可見性問題;

例如:當執行緒a從主記憶體中將共享變數count載入到執行緒a的工作記憶體後,發生了執行緒切換,這個時候執行緒b也將共享變數count從主記憶體載入到了執行緒b的工作記憶體,這時執行緒a和b的工作記憶體中count都是0,執行緒b執行了count = count + 1,然後寫回到主記憶體,這時候執行緒切換完成,回到了執行緒a再次執行 count = count + 1,再將執行緒a工作記憶體計算過的count寫回主記憶體,現在我們得到的主記憶體呢中count值是1而不是2。

在這裡講乙個例子,就是獲取單例雙重檢查鎖(double-checked locking)判斷:

/**

* @auther: lantao

* @date: 2019-03-28 14:32

* @company: 隨行付支付****

* @maill: [email protected]

* @description: todo

*/public class test1

return domain;

}}else}}

在上邊的**中在synchronized內和外都有乙個if判斷,判斷domain是否為null操作,有很多人對synchronized中的if null判斷不理解,其實可以這樣想,執行緒a和執行緒b都執行到了synchronized這裡進行競爭鎖,結果a得到鎖,判斷if null,結果還未例項化,繼續進行例項化,然後return物件並釋放鎖,這時執行緒b獲取到了鎖進入if null判斷,發現domain已經被執行緒a例項化過了,直接返回例項即可,第二個if null的作用就在這裡;

看上去上邊的**是完美的,但是new的操作上我們理解是:

但是實際上優化後(指令重排)的執行路徑可能是這樣的:

巨集觀事件和微觀事件

首先js執行過程中是從上往下執行,有同步和非同步執行之分 執行中是有分為塊的 在這些內容中 將會分為巨集觀和微觀任務 我們可以將整個js看做乙個大的巨集觀任務 執行時 會從上往下執行 如果執行的話 會先執行同步的 同步執行之後將執行巨集觀和微觀任務 首先 settimeout setinterval...

C 的巨集觀與微觀

巨集觀世界是由微觀世界所組成,這是亙古不變的道理,c 同樣是這樣 如果說生物是由原子組成的,那麼c 就是由物件模型組成的,物件模型就相當於原子模型,物件模型的變化和互相聯絡形成了目前c 一切的特性 再說c 巨集觀,c 的巨集觀表現為物件導向,由此細分了封裝,繼承,多型,反應到微觀上就是物件模型,物件...

Http巨集觀執行流程和微觀結構

request header null line request body response http的優點 缺點和特點 補充資料 關於tcp協議 描述了http的工作原理,圖多,雖然省略了路由的一些細節。這篇文章質量很高!get 請求獲取request uri所標識的資源 restful curd...