1. 程式人生 > >Java併發-Java併發機制的底層實現原理

Java併發-Java併發機制的底層實現原理

Java程式碼在編譯後程式設計Java位元組碼,位元組碼被類載入器載入到JVM裡,JVM執行位元組碼,最終需要轉化為彙編指令在CPU上執行,Java中所使用的併發機制依賴於JVM的實現和CPU的指令。

一、volatile的應用

在多執行緒併發程式設計中synchronized和volatile都扮演者重要的角色,volatile是輕量級的synchronized,它在多處理器開發中保證了共享變數的“可見性”。“可見性”指的是當一個執行緒修改一個共享變數時,另外一個執行緒能讀到這個修改的值。如果volatile變數修飾符使用恰當的話,它比synchronized的使用和執行成本更低,因為他不會引起執行緒上下文的切換和排程。本文將深入分析在硬體層面上Intel處理器是如何實現volatile的,通過深度分析幫助我們正確地使用volatile變數。

1.1volatile的定義與實現原理

Java程式語言允許執行緒訪問共享變數,為了能確保共享變數能被準確和一致地更新,執行緒應該確保通過拍他所單獨獲得這個變數。Java語言提供了volatile,在某些情況下比鎖要更加方便。如果一個欄位被宣告稱volatile, Java執行緒記憶體模型確保所有執行緒看到這個變數的值是一致的。 CPU術語 為了提高處理速度,處理器不直接和記憶體進行通訊,而是先將系統記憶體的資料讀到內部快取(L1,L2或者其他)後,再進行操作, 但操作完你知道何時會寫到記憶體。如果對聲明瞭volatile的變數進行寫操作,JVM就會想處理器傳送一條Lock字首的執行,
將這個變數所在快取航的資料街回到系統記憶體。但是就算是寫回到記憶體,如果其他處理器快取的值是舊的,再執行計算操作就會有問題。 所以,在多處理器下,當處理器發現自己快取行對應的記憶體地址被修改,就會將當前處理器的快取航設定為無效。 當處理器對這個資料進行修改操作的時候,會重新從系統記憶體中吧資料讀到處理器快取裡面。

Synchronized的實現原理和應用

Java中的每一個物件都可以作為鎖。具體表現有以下三種形式。
  • 對於普通同步方法,鎖是當前例項物件。
  • 對於靜態同步方法,鎖是當前類的Class物件。
  • 對於同步方法快,鎖是Synchonronized括號裡面的內建物件。
當一個執行緒試圖訪問同步程式碼塊時,它首先必須得到鎖,退出或跑出異常時必須釋放鎖。