volatile修飾的變數能夠保證可見性,但不保證原子性,每個執行緒能夠獲取該變數的最新值。
對volatile修飾的詞,程式在編譯的時候,會多乙個lock彙編指令如下圖所示:
該lock指令有兩個主要作用:
jmm主要是通過設定記憶體屏障來禁止指令重排序,下圖是匯程式設計序中的四種記憶體屏障型別
屏障型別
說明loadload barriers
保證load1資料的裝載先於load2及所有後續指令的裝載
storestore barriers
保證store1資料對其他處理器的可見先於store2及所有後續儲存指令的儲存
loadstore barriers
確保load1資料裝載先於store2及所有後續的儲存指令重新整理到記憶體
storeload barriers
確保store1資料對其他處理器的可見先於load2及所有後續裝載指令的裝載
volatile是如何防止指令重排序的:
在使用volatile時需滿足一下兩個條件:
使用區別:volatile只能修飾變數,synchronized只能修飾方法和語句塊
原子性:synchronized可以保證原子性,volatile不能保證原子性
可見性:都可以保證可見性,但實現原理不同volatile對變數加了lock,synchronized使用monitorenter和monitorexit monitor jvm
有序性:volatile能保證有序,synchronized可以保證有序性,但是代價(重量級)併發退化到序列
執行緒阻塞:synchronized會引起執行緒阻塞,volatitle不會引起執行緒阻塞
cpu快取是位於cpu與記憶體之間的臨時儲存器,它的容量比記憶體小的多但是交換速度卻比記憶體要快得多。快取記憶體的出現主要是為了解決cpu運算速度與記憶體讀寫速度不匹配的矛盾,因為cpu運算速度要比記憶體讀寫速度快很多,這樣會使cpu花費很長時間等待資料到來或把資料寫入記憶體。在快取中的資料是記憶體中的一小部分,但這一小部分是短時間內cpu即將訪問的,當cpu呼叫大量資料時,就可避開記憶體直接從快取中呼叫,從而加快讀取速度。
下圖為cpu高階快取層次圖:
在引入cpu告訴快取後,會伴隨著快取不一致的情況的出現,針對此問題,在cpu層引入:
快取鎖的核心是mesi(快取一致性協議)
mesi表是快取的四種狀態,分別是:
多執行緒 多執行緒原理
我們首先要知道什麼是多執行緒,說白了就是多個執行緒,執行緒是什麼呢,其實就是程序執行的途徑,那麼說道這裡我們又引入了乙個新的名字,就是程序,那麼我們來看看什麼是程序,其實我們自己也能看到,啟動電腦的任務管理器,我們就可以看到程序選項,裡面是我們電腦所有的程序,我們會發現有很多的程序.簡單地說就是程序...
多執行緒原理
計算機三大核心元件 cpu 記憶體和輸入輸出裝置 io 開啟多執行緒的最根本的目的是為了充分利用cpu,提高計算機資源利用率。cpu是傳送執行命令的地方,其只能從記憶體裡讀取指令來執行,也是執行緒排程的執行者 拿io來說,在單執行緒的情況下,假如此時有乙個執行緒需要執行io,這個過程分2個階段,1 ...
Java SE多執行緒部分 20 執行緒狀態
在指定的毫秒數內讓當前正在執行的執行緒休眠 暫停執行 此操作受到系統計時器和排程程式精度和準確性的影響。sleep計時等待 public class threadstatus catch interruptedexception e system.out.println thread.current...