1. 程式人生 > >java併發機制的底層實現原理(一):volatile深入分析

java併發機制的底層實現原理(一):volatile深入分析

     java程式碼最終會被類載入器載入到JVM中,然後轉化為彙編指令在CPU上執行。java中所使用的併發機制依賴於JVM的實現和CPU的指令。

1.volatile的應用

volatile是一個輕量級的synchronize,它保證了共享變數的可見性,確保了所有執行緒看到這個變數的值是一致的——變數一經修改所有的執行緒都可知道,都可以獲得共享變數的最新值。但是volatile並不能保證原子性。

1.1為何會存在可見性問題?

CPU為了提高處理速度,並不會直接和記憶體進行通訊,而是存在著多級內部快取。第一次訪問記憶體中的某個資料,會先將記憶體中的資料讀取到CPU快取中,下次再訪問時,就直接可以訪問快取而不是重新讀取記憶體,修改時,也可以直接修改快取中的資料。但是,快取中的資料寫回到記憶體中是不確定的,因此就有可能多個CPU中快取的資料時不一致的,這就導致了可見性問題。

1.2volatile實現的底層原理——volatile是如何解決可見性問題的

當一個變數被volatile修飾時,如果存在寫操作,也就是說要改變資料的時候,在底層彙編程式碼中,會多一條lock指令。這條lock指令幹了兩件事。

一:首先它會立即的將快取中的資料寫回到記憶體中。而且在寫回時,會獨佔共享記憶體——即阻止兩個CPU同時去修改共享變數。這保證了記憶體中的資料一定是最新的。

二:然後這個寫回操作會導致其他CPU中的快取無效。不同的CPU採用了不同的策略來實現這一點。有的通過嗅探技術,有的採用了控制協議。總之,這保證了一旦記憶體中的資料被更新後,下次訪問CPU中的快取一定能得到記憶體中的新值。