JAVA併發機制的底層實現原理

JAVA代碼在編譯後會變成字節碼,字節碼被類加載器加載到JVM中,JVM執行字節碼,最終需要轉化爲彙編指令在CPU上執行,JAVA中所使用的併發機制依賴於JVM的實現CPU的指令

->參考《JAVA併發編程的藝術》

1.volatile的應用

volatile是輕量級的synchronized,它只是用來保證共享變量的可見性,不能保證操縱的原子性。

【引申】–>volatile如何實現內存可見性?

  • 深入的說,通過加入內存屏障禁止重排序優化實現的。
  • 對volatile變量執行寫操作時,會在寫操作後加入一條store屏障指令。
  • 對volatile變量執行讀操作時,會在讀操作前加入一條load屏障指令。

1.1—volatile保證共享變量可見性

有volatile修飾的變量進行寫操作的時候會多出一行彙編代碼,該行代碼會有一個lock指令。

volatile的兩條實現原則:

①: Lock前綴指令會引起處理器緩存會寫到內存(使處理器獨佔任何共享內存)。

②:一個處理器的緩存回寫會導致其他處理器的緩存無效。

2.synchronized的實現原理和應用

⑴ synchronized實現同步的基礎:

①:對於普通方法,鎖是當前實例對象。

②:對於靜態同步方法,鎖是class對象。

③:同步方法塊,鎖是synchronized後面括號裏的對象。

⑵ JVM規範中的實現原理

JVM基於進入和退出Monitor對象實現方法同步和代碼塊的同步

⑶Mark Word標記位

synchronized用到的鎖是放在JAVA對象頭裏面的,其中有個Mark Word來存儲對象的hashcode、分代年齡和鎖標記位,其中鎖標記位會產生變化,對應的不同的標記,我們的鎖有3種:輕量級鎖、重量級鎖、偏向鎖

⑷鎖的升級與對比

從SE 1.6開始,鎖一共有四種狀態:無鎖狀態、偏向鎖狀態、輕量級鎖狀態、重量級鎖狀態。

①:偏向鎖

引入原因:大多數情況下,鎖僅有某一線程多次獲得,爲了使獲得鎖的代價更低而引入偏向鎖。

偏向鎖的設置:當某一線程訪問同步塊時,會在對象頭和棧幀中的瑣記錄裏存儲鎖偏向的線程ID,以後該線程在進入該同步塊的時候,不需要再次使用CAS原子操作進行加鎖和解鎖,只需要簡單的測試一下對象頭中的Mark Word是否存在指向當前線程的偏向鎖。如果測試成功,則表示獲得鎖,否則檢測是否設置有偏向鎖,如果沒有,則使用CAS競爭鎖,否則偏向鎖指向該線程。

偏向鎖的關閉:在6和7中是默認採用的,可以通過JVM參數關閉:UseBiaseLocking=false,此時程序進入輕量級鎖的狀態。

②:輕量級鎖

加鎖:線程執行同步塊之前,會在線程私有的棧幀中開闢用於存儲鎖記錄的空間,稱爲Displaced Mark Word。然後線程嘗試將對象Mark Word的替換爲指向Displaced Mark Word記錄的指針,如果成功,那麼當前線程獲得鎖,如果失敗,那麼使用自旋獲得鎖。

何爲自旋?

這裏寫圖片描述

輕量級鎖解鎖: 使用原子的CAS操作將Displaced Mark Word 替換回對象頭,如果成功,表示沒有競爭發生,否則,說明當前鎖存在競爭(從上圖可以看出,競爭鎖的線程一直在嘗試修改Mark Word,這肯定存在競爭),鎖就會膨脹成重量級的鎖。

因爲自旋會消耗CPU,爲了避免太多無用的自旋,一旦鎖膨脹成重量級的鎖,便不會再恢復到輕量級的鎖的狀態。當鎖處於這個狀態下,其他線程試圖獲取鎖時就被阻塞住。當鎖釋放時再喚醒這些線程。此時醒來的線程就會進行一輪新的競爭。

三種鎖的比較:

優點缺點使用場景
偏向鎖加鎖和解鎖不需要額外的消耗,和執行非同步方法之間存在納秒級的差距線程間存在鎖的競爭,會帶來額外的鎖撤銷的消耗適用於只有一個線程訪問同步塊的場景
輕量級鎖競爭的線程不會阻塞,提高程序的響應速度自旋消耗CPU追求響應時間,同步塊執行速度快
重量級鎖線程競爭不使用自旋,不消耗CPU線程阻塞,響應時間慢追求吞吐量,同步塊執行速度較長

3.原子操作的實現原理

⑴處理器實現原子操作的機制:

第一機制:總線鎖(聲言Lock信號)

第二機制共享緩存鎖(修改內存地址,緩存一致性機制:阻止同時修改由2個以上的處理器緩存的內存區域數據)。

⑵JAVA實現原子操作的機制

第一個是循環CAS:JVM中的CAS操縱是利用了處理器提供的CMPXCHG指令實現的。自旋CAS的基本思路是循環進行CAS操作,直到CAS操作成功了爲止。

⑶使用鎖機制實現原子操作

鎖機制保證只有獲得鎖的線程才能夠操作鎖定的內存區域。注意:除了偏向鎖,JVM實現鎖的方式都用了循環CAS操作(使用循環CAS獲取鎖,使用循環CAS釋放鎖)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章