JVM層級的記憶體屏障 JSR記憶體屏障

2021-10-06 04:37:14 字數 1284 閱讀 8728

jsr記憶體屏障:

loadload:對於這樣的語句load1;loadload;load2,在load2及後續的讀操作要讀取的資料被訪問前,保證load1要讀取的資料被讀取完畢;

storestore:對於這樣的語句store1;storestore;store2,在store2及後續的寫操作執行前,保證store1的寫入操作對其他處理器可見;

loadstore:對於這樣的語句load1;loadstore;store2,在store2及後續的寫入操作被刷出前,保證load1要讀取的資料被讀取完畢;

storeload:對於這樣的語句store1;storeload;load2,在load2及後續的讀操作要讀取的資料被訪問前,保證store1的寫入操作對其他處理器可見;

as-if-serial:不管如何重排序,單執行緒執行結果不會改變。在jvm層面volatile的實現細節特別保守,保證了記憶體可見性,並且成功防止指令重排序。如果是對物件加入volatile,是對該物件前後加入記憶體屏障,具體的實現細節如下所示:

storestorebarrier

volatile 寫操作

storeloadbarrier

loadloadbarrier

volatile 讀操作

loadstorebarrier

執行緒啟動規則:thread的start()方法先行發生於這個執行緒的每乙個操作;

執行緒終止原則:執行緒的所有操作都先行於此執行緒的終止檢測,可以通過thread.join()方法結束、thread.isalive()的返回值等手段檢測線程的終止;

執行緒中斷原則:對執行緒interrupt()方法的呼叫先行發生於被中斷執行緒的**檢測到中斷事件的發生,可以通過thread.interrupt方法檢測線程是否中斷;

物件終結規則:乙個物件的初始化完成先於發生它的finalize()方法的開始;

volatile關鍵字修飾變數的特殊規則:

可見性:對乙個volatile變數的讀,總是能看到(任意執行緒)對這個volatile變數最後的寫入。

原子性:對任意單個volatile變數的讀/寫具有原子性,但類似於volatile++這種復合操作不具有原子性。

final域的重排序規則:

在建構函式內對乙個final域的寫入,與隨後把這個被構造物件的引用賦值給乙個引用變數,這兩個操作之間不能重排序;

初次讀乙個包含final域的物件的引用,與隨後初次讀這個final域,這兩個操作之間不能重排序;

優化屏障和記憶體屏障

優化屏障和記憶體屏障 優化屏障 編譯器編譯源 時,會將源 進行優化,將源 的指令進行重排序,以適合於cpu的並行執行。然而,核心同步必須避免指令重新排序,優化屏障 optimization barrier 避免編譯器的重排序優化操作,保證編譯程式時在優化屏障之前的指令不會在優化屏障之後執行。linu...

關於記憶體屏障

define set mb var,value do while 0 define mb asm volatile memory 1 set mb mb barrier 函式追蹤到底,就是 asm volatile memory 而這行 就是記憶體屏障。2 asm 用於指示編譯器在此插入彙編語句 3...

Linux記憶體屏障

首先這裡有一篇文章介紹記憶體屏障的,寫的挺好的,可以看看 linux記憶體屏障是用來解決指令亂序的問題。什麼是指令的亂序呢?簡單一點說就是本來 裡面是這麼寫的 instruction a intstuction b 結果在cpu上執行變成了 instruction b instruction a 導...