JMM是怎麼解決原子性、可見性、有序性問題的?

Java內存模型封裝了底層的實現後提供給開發人員一系列和併發處理相關的關鍵字,,好比volatile、Synchronized、final等,在開發多線程代碼的時候,咱們能夠直接使用 這些關鍵詞來控制併發,從而不須要關心底層的編譯器優化、緩存一致性的問題了,因此JMM除了定義了一套規範外,還給開發人員提供了一套在底層封裝後的開放的指令。 
一.原子性 
在java中提供了兩個高級的字節碼指令monitorenter和monitorexit,使用對應的關鍵字Synchronized來保證代碼塊內的操做是原子的 
二.可見性 
在Java中能夠使用volatile關鍵字來保證多線程操做時變量的可見性。volatile的功能是被其修飾的變量在被修改後能夠當即同步到主內存,而被其修飾的變量在每次使用以前都會從主內存刷新。除此以外,synchronized和final兩個關鍵字也能夠實現可見性 。volatile也能夠看做是輕量級的鎖,在其內部使用了Lock指令來解決可見性問題。 
volatile關鍵字修飾的共享變量,在進行寫操做的時候會多出一個lock前綴的彙編指令,這個指令會觸發總線鎖或者緩存鎖,經過緩存一致性協議來解決可見性問題。對於聲明瞭volatile的變量進行寫操做時,JVM就會向處理器發送一條Lock前綴的指令,把這個變量所在的緩存行的數據寫回到系統內存,再根據MESI的緩存一致性協議,來保證多核CPU下的各個高速緩存中的數據的 一致性。java

相關文章
相關標籤/搜索