總課程:
1、JMM。
每個執行緒會產生一個變數副本。如下圖所示,第二個變數修改了變數initFlag,但執行緒1並不會退出,是因為每個執行緒產生了副本。----解決方法:volatile
CPU快取一致性協議:MESI機制,以及記憶體模型底層八大原子操作。
Volatile快取可見性實現原理:底層實現主要透過彙編lock字首指令,它會鎖定這塊記憶體區域的快取(快取行鎖定),並回寫到主記憶體:
lock指令的解釋:
1、會將當前處理器快取行的資料立即寫回到系統主記憶體。
2、透過MESI協議,這個寫回記憶體的操作會引起在其他CPU裡快取了該記憶體地址的資料無效。
3、提供記憶體屏障功能,使lock前後指令不能重排序。
指令重排序和記憶體屏障。
併發程式設計三大特性:可見性、有序性、原子性。
volatile保證可見性與有序性,但是不保證原子性,synchronized可以保證原子性。
指令重排序:在不影響單執行緒程式執行結果的前提下,計算機為了最大限度的發揮機器效能, 會對機器指令重排序最佳化。
重排序遵循的原則:as-if-serial與happens-before原則。
as-if-serial:
不管怎麼重排序,單執行緒程式的執行結果不能被改變。所以編譯器和處理器不會對資料依賴關係的操作做重排序。
happens-before原則: